{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "210388b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "#给定函数和x的取值范围，绘制出函数图像\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "KB = 1024\n",
    "MB = 1024 * KB\n",
    "us = 10**-6\n",
    "ms = 10**-3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "53b82f24",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Predictor:\n",
    "    def __init__(self):\n",
    "        self.alpha = 0.5\n",
    "        self.beta = 894427\n",
    "        self.page = 4*KB\n",
    "        self.Brand = 200*MB\n",
    "        self.Bseq = 440*MB\n",
    "        self.R1 = 30\n",
    "        self.R2 = 30\n",
    "        self.Tcal = 0.25*us\n",
    "        self.Svector = 128 #每个向量的大小，单位Byte\n",
    "        self.Cvector = 1000000\n",
    "        self.l2_update_ratio = 0.6\n",
    "        self.redundancy = 2\n",
    "\n",
    "    def L3_visit(self, Ccluster):\n",
    "        return self.beta / (Ccluster**self.alpha)\n",
    "    \n",
    "    #每个聚类包含的向量数量\n",
    "    def vector_per_cluster(self, Ccluster):\n",
    "        return self.Cvector*self.redundancy/Ccluster\n",
    "    \n",
    "    #每个聚类的大小（单位B）\n",
    "    def cluster_size(self, Ccluster):\n",
    "        return self.vector_per_cluster(Ccluster) * self.Svector\n",
    "    \n",
    "    def nprobe(self, Ccluster):\n",
    "        return self.L3_visit(Ccluster) / (self.Cvector*self.redundancy/Ccluster)\n",
    "    \n",
    "    def L1_latency(self, Ccluster):\n",
    "        return self.nprobe(Ccluster)*(self.R1*self.Tcal) * 1000\n",
    "    \n",
    "    def L2_latency(self, Ccluster):\n",
    "        return self.nprobe(Ccluster)*self.l2_update_ratio*((self.page/self.Brand) + self.R2*self.Tcal) * 1000\n",
    "    \n",
    "    def L3_Cal(self, Ccluster):\n",
    "        return self.L3_visit(Ccluster)*self.Tcal * 1000\n",
    "    \n",
    "    #聚类数量*每个聚类的IO时间，其中每个聚类的IO时间为聚类大小/页大小并且向上取整再除以带宽\n",
    "    def L3_IO(self, Ccluster):\n",
    "        # read_page_count = np.ceil(self.cluster_size(Ccluster)/self.page)\n",
    "        read_page_count = self.cluster_size(Ccluster)/self.page\n",
    "        read_page_size = read_page_count * self.page\n",
    "        return self.nprobe(Ccluster) * (read_page_size/self.Bseq) * 1000\n",
    "    \n",
    "    def L3_latency(self, Ccluster):\n",
    "        return np.maximum(self.L3_Cal(Ccluster), self.L3_IO(Ccluster))\n",
    "    \n",
    "    #由于L3计算和IO是并行的，所以L3的延迟约为L3_Cal和L3_IO的最大值\n",
    "    def Latency(self, Ccluster):\n",
    "        return self.L1_latency(Ccluster) + self.L2_latency(Ccluster) + self.L3_latency(Ccluster)\n",
    "    \n",
    "    #绘制函数图像，同时把x和y的保存到csv文件中\n",
    "    def draw(self, x_range, point, fun=None, filename='latency.csv'):\n",
    "        # 1. 生成x的取值范围\n",
    "        x = np.linspace(x_range[0], x_range[1], point)  \n",
    "\n",
    "        # 2. 计算函数对应的y值\n",
    "        y=0\n",
    "        if fun == None:\n",
    "            y = self.Latency(x)\n",
    "        else:\n",
    "            y = fun(x)\n",
    "\n",
    "        # 3. 计算最小值点\n",
    "        min_idx = np.argmin(y)  # 获取最小值的索引\n",
    "        min_x = x[min_idx]      # 最小值对应的x坐标\n",
    "        min_y = y[min_idx]      # 最小值\n",
    "\n",
    "        # 4. 绘制函数图像\n",
    "        plt.plot(x, y, label='Latency vs cluster')  # 绘制曲线\n",
    "\n",
    "        # 5. 标记最小值点\n",
    "        plt.scatter(min_x, min_y, color='red', s=50, zorder=5, label=f'Min: ({min_x:.2f}, {min_y:.2f})')\n",
    "\n",
    "        # 6. 添加注释\n",
    "        plt.annotate(f'x={min_x:.2f}, y={min_y:.2f}\\n nprobe={self.nprobe(min_x):.2f}',  # 注释文本\n",
    "                    xy=(min_x, min_y),              # 被注释的坐标点\n",
    "                    xytext=(min_x, min_y+min_y),       # 注释文本的坐标位置\n",
    "                    arrowprops=dict(arrowstyle='->'),# 箭头样式\n",
    "                    fontsize=10)                    # 字体大小\n",
    "\n",
    "        # 7. 完善图像\n",
    "        plt.xlabel('Cluster')\n",
    "        plt.ylabel('Latency(ms)')\n",
    "        plt.title('Latency vs cluster')\n",
    "        plt.grid(True)\n",
    "        plt.legend()\n",
    "\n",
    "        # 8. 显示图像\n",
    "        plt.show()\n",
    "\n",
    "        # 9. 保存x和y到csv文件，不用科学计数法\n",
    "        data = np.column_stack((x, y))\n",
    "        np.savetxt(filename, data, delimiter=',', header='x,y', comments='', fmt='%.6f')\n",
    "\n",
    "        return min_x\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0d761245",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAHFCAYAAADVIXIDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgfBJREFUeJzt3Xd4U+XbB/BvmqbpTPfezJYyFZApe08RB7IdP5Ehw4WKLFkqIq8oiIshAorQgIAs2QKyoZSNlLJKC4XuNmnyvH+UBkJ3mvak7fdzXb1oznnOOXeerptnyoQQAkREREQVgJXUARAREREVFxMXIiIiqjCYuBAREVGFwcSFiIiIKgwmLkRERFRhMHEhIiKiCoOJCxEREVUYTFyIiIiowmDiQkRERBUGExeicrZ06VLIZDIcPXrULPebNWsW1Gq1We5FwO7duyGTybB79+4yuf/Zs2cxdepUxMTElMn9iSo7Ji5EFRwTl4rl7NmzmDZtGhMXIhMxcSEiqgTS09OlDoGoXDBxIbJAmZmZeOedd9CwYUM4OzvDzc0NzZs3x/r1643KyWQypKWlYdmyZZDJZJDJZGjbtq3hfFxcHN58800EBATAxsYGoaGhmDZtGrKzsw1lYmJiIJPJMHfuXMybNw+hoaFwdHRE8+bNcejQoTyx/fvvv+jVqxfc3d1ha2uL6tWrY9y4cQCAffv2QSaTYdWqVXmuW758OWQyGY4cOZLvez516hRkMhl++umnPOf++usvyGQybNiwAQCQkJCA//3vfwgMDIRSqYSnpydatmyJHTt2FFm358+fx4ABA+Dt7Q2lUomgoCAMGTIEWVlZBV7Ttm1bo3rNNWzYMISEhBgdW7RoERo0aABHR0c4OTkhLCwMH330EYCcbsIXXngBANCuXTvD12zp0qWG63fs2IEOHTpApVLB3t4eLVu2xN9//230jKlTp0Imk+H48ePo378/XF1dUb169SLfO1FlYC11AESUV1ZWFhITE/Huu+/C398fGo0GO3bsQL9+/bBkyRIMGTIEAHDw4EG0b98e7dq1wyeffAIAUKlUAHKSlqZNm8LKygqTJ09G9erVcfDgQcyYMQMxMTFYsmSJ0TO//fZbhIWFYf78+QCATz75BN27d8fVq1fh7OwMANi6dSt69eqF8PBwzJs3D0FBQYiJicG2bdsAAK1bt0ajRo3w7bffYsCAAUb3/+abb9CkSRM0adIk3/fcoEEDNGrUCEuWLMFrr71mdG7p0qXw8vJC9+7dAQCDBw/G8ePHMXPmTNSqVQsPHjzA8ePHce/evULr9dSpU2jVqhU8PDwwffp01KxZE7dv38aGDRug0WigVCoLvb4oq1evxsiRIzFmzBjMnTsXVlZWuHz5Ms6ePQsA6NGjB2bNmoWPPvoI3377LZ566ikAMCQdK1aswJAhQ9CnTx8sW7YMCoUCixcvRpcuXbB161Z06NDB6Hn9+vXDyy+/jBEjRiAtLa1UsRNVGIKIytWSJUsEAHHkyJFiX5OdnS20Wq147bXXRKNGjYzOOTg4iKFDh+a55s033xSOjo7i2rVrRsfnzp0rAIjo6GghhBBXr14VAES9evVEdna2odzhw4cFALFq1SrDserVq4vq1auLjIyMIt/fiRMn8txr2bJlhb7Pr7/+WgAQFy5cMBxLTEwUSqVSvPPOO4Zjjo6OYty4cYXeKz/t27cXLi4uIj4+vsAyu3btEgDErl27DMfatGkj2rRpk6fs0KFDRXBwsOH16NGjhYuLS6ExrFmzJs/9hRAiLS1NuLm5iV69ehkd1+l0okGDBqJp06aGY1OmTBEAxOTJkwt9FlFlxK4iIgu1Zs0atGzZEo6OjrC2toZCocBPP/2Ec+fOFev6jRs3ol27dvDz80N2drbho1u3bgCAPXv2GJXv0aMH5HK54XX9+vUBANeuXQMAXLx4EVeuXMFrr70GW1vbAp87YMAAeHl54dtvvzUcW7BgATw9PfHSSy8VGvPAgQOhVCqNuk5WrVqFrKwsDB8+3HCsadOmWLp0KWbMmIFDhw5Bq9UWURs5Y0D27NmDF198EZ6enkWWN0XTpk3x4MEDDBgwAOvXr8fdu3eLfe2BAweQmJiIoUOHGn299Ho9unbtiiNHjuRpVXn++efN/RaILB4TFyILtG7dOrz44ovw9/fHihUrcPDgQRw5cgSvvvoqMjMzi3WPO3fu4M8//4RCoTD6iIiIAIA8f1Td3d2NXud2m2RkZADIGVcCAAEBAYU+V6lU4s0338TKlSvx4MEDJCQk4Pfff8frr79eZFeMm5sbevfujeXLl0On0wHI6SZq2rSpIW4A+O233zB06FD8+OOPaN68Odzc3DBkyBDExcUVeO/79+9Dp9MVGX9pDB48GD///DOuXbuG559/Hl5eXnjmmWewffv2Iq+9c+cOAKB///55vmafffYZhBBITEw0usbX17dM3geRJeMYFyILtGLFCoSGhuK3336DTCYzHC9sAOmTPDw8UL9+fcycOTPf835+fiWKKbeV4saNG0WWfeuttzBnzhz8/PPPyMzMRHZ2NkaMGFGs5wwfPhxr1qzB9u3bERQUhCNHjmDRokVGZTw8PDB//nzMnz8fsbGx2LBhAyZOnIj4+Hhs2bIl3/u6ublBLpcXK/4n2draIikpKc/x/FpUhg8fjuHDhyMtLQ179+7FlClT0LNnT1y8eBHBwcEFPsPDwwNATutUs2bN8i3j7e1t9Prx7w2iqoKJC5EFkslksLGxMfrDFBcXl2dWEZDTwpHbKvK4nj17YvPmzahevTpcXV1LHVOtWrVQvXp1/Pzzz5gwYUKhrSe+vr544YUXsHDhQmg0GvTq1QtBQUHFek7nzp3h7++PJUuWICgoCLa2tnkG+j4uKCgIo0ePxt9//41//vmnwHJ2dnZo06YN1qxZg5kzZxoSheIICQnBmjVrkJWVZXjf9+7dw4EDBwyDoZ/k4OCAbt26QaPRoG/fvoiOjkZwcHCelqxcLVu2hIuLC86ePYvRo0cXOzaiqoaJC5FEdu7cme8iZN27d0fPnj2xbt06jBw5Ev3798f169fx6aefwtfXF5cuXTIqX69ePezevRt//vknfH194eTkhNq1a2P69OnYvn07WrRogbfffhu1a9dGZmYmYmJisHnzZnz33Xcl7jb59ttv0atXLzRr1gzjx49HUFAQYmNjsXXrVvz6669GZceOHYtnnnkGAPLMYCqMXC7HkCFDMG/ePKhUKvTr188wqwkAkpKS0K5dO7zyyisICwuDk5MTjhw5gi1btqBfv36F3nvevHlo1aoVnnnmGUycOBE1atTAnTt3sGHDBixevBhOTk75Xjd48GAsXrwYgwYNwhtvvIF79+7h888/z5O0vPHGG7Czs0PLli3h6+uLuLg4zJ49G87OzobZVHXr1gUAfP/993BycoKtrS1CQ0Ph7u6OBQsWYOjQoUhMTET//v3h5eWFhIQEnDp1CgkJCXlanoiqJKlHBxNVNbmzbgr6uHr1qhBCiDlz5oiQkBChVCpFeHi4+OGHHwyzSR538uRJ0bJlS2Fvby8AGM1+SUhIEG+//bYIDQ0VCoVCuLm5iaefflp8/PHHIjU1VQjxaFbRF198kSdWAGLKlClGxw4ePCi6desmnJ2dhVKpFNWrVxfjx4/P972GhISI8PDwEtfRxYsXDfWxfft2o3OZmZlixIgRon79+kKlUgk7OztRu3ZtMWXKFJGWllbkvc+ePSteeOEF4e7uLmxsbERQUJAYNmyYyMzMFELkP6tICCGWLVsmwsPDha2trahTp4747bff8swqWrZsmWjXrp3w9vYWNjY2ws/PT7z44ovi9OnTRveaP3++CA0NFXK5XAAQS5YsMZzbs2eP6NGjh3BzcxMKhUL4+/uLHj16iDVr1hjK5H4fJCQkFLNGiSoPmRBClH+6RESV3enTp9GgQQN8++23GDlypNThEFElwcSFiMzqypUruHbtGj766CPExsbi8uXLsLe3lzosIqokOB2aiMzq008/RadOnZCamoo1a9YwaSEis2KLCxEREVUYbHEhIiKiCoOJCxEREVUYTFyIiIiowqjQC9Dp9XrcunULTk5OXPqaiIioghBCICUlBX5+frCyKlkbSoVOXG7duoXAwECpwyAiIiITXL9+vcQreFfoxCV3ee7r168XuF9IcWi1Wmzbtg2dO3eGQqEwV3iUD9Z1+WFdlx/WdflifZefsqrr5ORkBAYGFrjNRmEqdOKS2z2kUqlKnbjY29tDpVLxh6CMsa7LD+u6/LCuyxfru/yUdV2bMsyDg3OJiIiowmDiQkRERBUGExciIiKqMCr0GBciIkug0+lgbW2NzMxM6HQ6qcOp9LRaLeu7nJha1wqFAnK5vExiYuJCRGQiIQTi4uJw//59+Pj44Pr161xTqhwIIVjf5aQ0de3i4gIfHx+zf42YuBARmSguLg4PHjyAp6cn9Ho9nJycSryYFpWcXq9HamoqHB0dWd9lzJS6FkIgPT0d8fHxAABfX1+zxsTEhYjIBDqdDg8ePICXlxdcXV2RnJwMW1tb/iEtB3q9HhqNhvVdDkytazs7OwBAfHw8vLy8zNptxK84EZEJtFotAMDe3l7iSIgsU+7PRu7PirkwcSEiKgWOsSDKX1n9bDBxISIiogqDiQsREZGZyGQyqNVqqcOo1Ji4EBFVMcOGDUPfvn1Nvn7p0qVwcXExWzyUv927d0Mmk+HBgwdSh2JROKsoHxkaHRLTNVBYyeClspU6HCIiIpMJIQyLJFYGbHHJx9boOLScsxMTfj8ldShEROVu3rx5qFevHhwcHBAYGIiRI0ciNTUVQE4rwPDhw5GUlASZTAaZTIapU6cCADQaDd5//334+/vDwcEBzzzzDHbv3m24b25LzdatWxEeHg5HR0d07doVt2/fNnr+zz//jIiICCiVSvj6+mL06NEAgFdffRU9e/Y0KpudnQ0fHx/8/PPPed5HUlIS7OzssGXLFqPj69atg4ODA1JTU6HRaDB69Gj4+vrC1tYWISEhmD17dqH1U1B8T8qvxeTkyZOQyWSIiYkBAFy7dg29evWCq6srHBwcEBERgc2bNyMmJgbt2rUDALi6ukImk2HYsGEAchKRzz//HNWqVYOdnR0aNGiAP/74I89zt27disaNG0OpVGLfvn2FvqeKpHKkX2ZmLc8ZCa3V6SWOhIgqEiEE0jXZkjzbTiE32ywOKysrfP311wgJCcHVq1cxcuRIvP/++1i4cCFatGiB+fPnY/Lkybhw4QIAwNHREQAwfPhwxMTEYPXq1fDz80NkZCS6du2KqKgo1KxZEwCQnp6OuXPn4pdffoGVlRUGDRqEd999F7/++isAYNGiRZgwYQLmzJmDbt26ISkpCf/88w8A4PXXX8ezzz6L27dvw8HBAQCwefNmpKam4sUXX8zzPpydndGjRw/8+uuv6Nq1q+H4ypUr0adPHzg6OmLu3LnYsGEDfv/9dwQFBeH69eu4fv16gXVTWHymGDVqFDQaDfbu3QsHBwecPXsWjo6OCAwMxNq1a/H888/jwoULUKlUhrVRJk2ahHXr1mHRokWoWbMm9u7di0GDBsHT0xNt2rQx3Pv999/H3LlzUa1atUrVtcfEJR8KeU5DFBMXIiqJDK0Odadul+TZZ6d3gb2NeX6ljxs3zvB5aGgoPv30U7z11ltYuHAhbGxs4OzsDJlMBh8fH0O5K1euYNWqVbhx4wb8/PwAAO+++y62bNmCJUuWYNasWQBy1vT47rvvUL16dQDA6NGjMX36dMN9ZsyYgXfeeQdjx441HGvSpAkAoEWLFqhduzZWrFiBN998EwCwZMkSvPDCC4bk6UkDBw7EkCFDkJ6eDnt7eyQnJ2PTpk1Yu3YtACA2NhY1a9ZEq1atIJPJEBwcXGjdFBafKWJjY/H888+jXr16AIBq1aoZzrm5uQEAvLy8DIlHWloa5s2bh507d6J58+aGa/bv34/FixcbJS7Tp09Hp06dTI7NUrGrKB+Khy0u2XohcSREROVv165d6NSpE/z9/eHk5IQhQ4bg3r17SEtLK/Ca48ePQwiBWrVqwdHR0fCxZ88eXLlyxVDO3t7ekLQAOcvB5y4NHx8fj1u3bqFDhw4FPuf111/H0qVLDeU3bdqEV199tcDyPXr0gLW1NTZs2AAAWLt2LZycnNC5c2cAOQOVT548idq1a+Ptt9/Gtm3bCrxXceIrqbfffhszZsxAy5YtMWXKFJw+fbrQ8mfPnkVmZiY6depkVM/Lly83qmcAaNy4sdnitCRsccmHtVVuiwsTFyIqPjuFHGend5Hs2eZw7do1dO/eHSNGjMCnn34KNzc37N+/H6+99lqhK6Dq9XrI5XIcO3Ysz/Luj7eGKBQKo3MymQxC5Pyuze0KKcyQIUMwceJEHD58GFFRUQgJCUHr1q0LLG9jY4P+/ftj5cqVePnll7Fy5Uq89NJLhoGqTz31FK5evYq//voLO3bswIsvvoiOHTsajRnJVZz4Hpe7RH7u+wPyriL7+uuvo0uXLti0aRO2bduG2bNn48svv8SYMWPyvaden9MTsGnTJvj7+xudUyqVRq9zu9MqGyYu+eAYFyIyhUwmg72N+fZkkcLRo0eRnZ2NL7/80vCH9/fffzcqY2NjA51OZ3SsUaNG0Ol0iI+PLzSRKIyTkxNCQkLw999/GwamPsnd3R19+vTBypUrcezYMQwfPrzI+w4cOBCdO3dGdHQ0du3ahU8//dTovEqlwksvvYSXXnoJ/fv3R9euXZGYmGjoqilJfI/z9PQEANy+fRuurq4AcgbnPikwMBAjRozAiBEj8OGHH+KHH37AmDFjYGNjAwBGdV2nTh0olUrExsYadQtVJUxc8mHzcIxLNhMXIqqkkpKS8vwRdXNzQ/Xq1ZGdnY0FCxagV69e+Oeff/Ddd98ZlQsJCUFqair+/vtvNGjQAPb29qhVq5ZhPMmXX36JRo0a4e7du9i5cyfq1auH7t27FyuuqVOnYsSIEfDy8kK3bt2QkpKCf/75x6gF4rXXXkPv3r2h0+kwdOjQIu/Zpk0beHt7Y+DAgQgJCUGzZs0M57766iv4+vqiYcOGsLKywpo1a+Dj41PgYNbixJerRo0aCAwMxNSpUzFjxgxcunQJX375pVGZcePGoVu3bqhVqxbu37+PnTt3Ijw8HAAQHBwMmUyGjRs3onv37rCzs4OTkxPeffddjB8/Hnq9Hq1atUJycjIOHDgAR0fHYtVHhScqsKSkJAFAJCUlleo+Go1GqNVqodFohBBCnIi9L4I/2ChazP7bHGHSY56sayo7rOuylZGRIc6ePSsyMjKETqcT9+/fFzqdTuqwimXo0KECQJ6PoUOHCiGEmDdvnvD19RV2dnaiS5cuYvny5QKAuH//vuEeI0aMEO7u7gKAmDJlihAi53tu8uTJIiQkRCgUCuHj4yOee+45cfr0aSGEEEuWLBHOzs5GsURGRoon/xR99913onbt2kKhUAhfX18xZswYo/PZ2dkiMDBQdOvWrdjv+b333hMAxOTJk42Of//996Jhw4bCwcFBqFQq0aFDB3H8+PFC71VYfABEZGSk4fX+/ftFvXr1hK2trWjdurVYs2aNACCuXr0qhBBi9OjRonr16kKpVApPT08xePBgcffuXcP106dPFz4+PkImkxm+Pnq9Xvzf//2fIQZPT0/RpUsXsWfPHiGEELt27crz9TJVab63H/8ZeVJp/n7LhBAVdiBHcnIynJ2dkZSUBJVKZfJ9tFotNm/ejO7du0OhUODMzST0XLAf3iol/v2ooxkjpifrmsoO67psZWZm4urVqwgNDYWNjQ2Sk5OhUqkM3StUdlJTU+Hv74+ffvoJ/fv3lzqcSk2v15v8vf34z4itrfFirqX5+y3pT1h2djYmTZqE0NBQ2NnZoVq1apg+fbph8JFUHk2HrrA5HRFRpaPX63Hr1i1MnjwZKpUKvXv3ljokkoCkY1w+++wzfPfdd1i2bBkiIiJw9OhRDB8+HM7OzkZz5MubgoNziYgsTmxsLEJDQxEQEIBvvvmm0ixhTyUj6Vf94MGD6NOnD3r06AEgZ8DXqlWrcPToUSnDMrS4ZLPFhYjIYoSEhEAIYei+oKpJ0sSlVatW+O6773Dx4kXUqlULp06dwv79+zF//vx8y2dlZSErK8vwOvcbV6vVFrq+QFFyr839V+hzpp5l6/Wlui/l9WRdU9lhXZctrVZr+COaO1Qw9zWVLdZ3+SlNXef+bGi12jxr+5Tm95KkicsHH3yApKQkhIWFQS6XQ6fTYebMmRgwYEC+5WfPno1p06blOb5t2zbY29uXOp7t23OW6k7WAIA1tDqBTZs2w0zbf9Bjcuuayh7rumxYW1vDx8fHsFEfAKSkpEgcVdXC+i4/ptS1RqNBRkYG9u7di+xs4z280tPTTY5F0llFq1evxnvvvYcvvvgCEREROHnyJMaNG4d58+blOxc9vxaXwMBA3L17t9SzirZv345OnTpBoVAgKUOLxrN2AQDOTu1o6Dqi0nuyrqnssK7LVmZmJq5fv46QkBAolUqkpKTAycnJbBsdUsGEEKzvclKaus7MzERMTAwCAwPznVXk4eFh0qwiSVtc3nvvPUycOBEvv/wyAKBevXq4du0aZs+enW/iolQq8yxpDOQsIW2OX8y597HTP/riyKysoTDTUtr0iLm+ZlQ01nXZ0Ol0kMlksLKyMvxCz31NZSu3y4L1XfZKU9e5Pxv5/Q4qze8kSb/i6enpeSpCLpdL3meZu+Q/AGjZf0pERGQxJG1x6dWrF2bOnImgoCBERETgxIkTmDdvXqE7fZYHxWPJlDabiQsREZGlkLTFZcGCBejfvz9GjhyJ8PBwvPvuu3jzzTfzbIBV3qysZLB62OiSreeUaCKq2tq2bYtx48aVyb1/+ukndO7cuUzuTWVn48aNaNSokSQ9JJImLk5OTpg/fz6uXbuGjIwMXLlyBTNmzDDsiCmlR6vnssWFiMpBRgZw507Ov2Vs2LBhkMlkGDFiRJ5zI0eOhEwmw7BhwwzH1q1bVyb/oczKysLkyZPxySefGI798MMPaN26NVxdXeHq6oqOHTvi8OHDRtctWrQILVu2hIuLC1QqFZo3b46//vqrwOe8+eabkMlkeZba+P7779G2bVuoVCrIZDI8ePAgz7UXL15Enz594OHhAZVKhZYtW2LXrl2Fvq/U1FSMHj0aAQEBsLOzQ3h4OBYtWpRvWSEEunXrBplMBrVaXeh9n3ThwgW0a9cO3t7esLW1RbVq1TBp0qRCpxrHxMTgtddeM6xYX716dUyZMsUwM+5J9+7dQ0REBORyuVH99OzZEzKZDCtXrixRzObAUU0F4CJ0RFQu9u8H+vUDHB0BH5+cf/v1A/75p0wfGxgYiNWrVyPjsUQpMzMTq1atQlBQkFFZNzc3ODk5mT2GtWvXwtHREa1btzYc2717NwYMGIBdu3bh4MGDCAoKQufOnXHz5k1DmYCAAEyZMgWHDx/G0aNH0b59e/Tp0wfR0dF5nqFWq/Hvv//Cz88vz7n09HR07doVH330UYEx9ujRA9nZ2di5cyeOHTuGhg0bomfPnoiLiyvwmvHjx2PLli1YsWIFzp07h/Hjx2PMmDFYv359nrLz5883eWaUQqHAkCFDsG3bNly4cAHz58/HDz/8gClTphR4zfnz56HX67F48WJER0fjq6++wnfffVdgHbz++uuoU6dOvueGDx+OBQsWmBR7qZR4W0YLUla7QwshRINpW0XwBxvFxbjk0oZJj+GOxeWHdV22zLI79MKFQshkQlhbCwE8+rC2zjm+aFGZxD506FDRp08fUa9ePbFixQrD8V9//VXUq1dP9OnTx7ATsRBCtGnTRowdO9bwOjg4WMycOVMMHz5cODo6isDAQLF48eISx9GrVy/x7rvvFlomOztbODk5iWXLlhmO5Vffrq6u4scffzS69saNG8Lf31+cOXNGBAcHi6+++irfZxS0m3JCQoIAIPbu3Ws4lpycLACIHTt2FBhzRESEmD59utGxp556SkyaNMno2MmTJ0VAQIC4fft2nl2lTTV+/HjRqlWrEl3z+eefi9DQ0DzHFy5cKNq0aSPWr1+fb/3ExMQIAOLKlSv53resdodmi0sBrK240SIRlaH9+4FRo3JSlScW50J2ds7xkSPLtOVl+PDhWLJkieH1zz//XOzJEV9++SUaN26MEydOYOTIkXjrrbdw/vx5w/m2bdsadTflZ9++fWjcuHGhZdLT06HVauHm5pbveZ1Oh9WrVyMtLQ3Nmzc3HNfr9Rg8eDDee+89REREFOs9Pcnd3R3h4eFYvnw50tLSkJ2djcWLF8Pb2xtPP/10gde1atUKGzZswM2bNyGEwK5du3Dx4kV06dLF6H0NGDAA33zzDXx8fEyK70mXL1/Gli1b0KZNmxJdl5SUlKd+z549i+nTp2Pp0qUFToMODg6Gl5cX9u3bZ3LMpmDiUgCbh1OiszkdmojKwrx5gLyINaLkcuCrr8oshMGDB2P//v2IiYnBtWvX8M8//2DQoEHFurZ79+4YOXIkatSogQ8++AAeHh7YvXu34XxQUBB8fX0LvP7Bgwd48OBBvl04j5s4cSL8/f3RsWNHo+PR0dFQqVRQKpUYMWIEIiMjjbo0PvvsM1hbW+Ptt98u1vvJj0wmw/bt23HixAk4OTnB1tYWX331FbZs2QIXF5cCr/v6669Rp04dBAQEwMbGBl27dsXChQvRqlUrQ5nx48ejRYsW6NOnj8nx5WrRogVsbW1Rs2ZNtG7dGtOnTy/2tVeuXMGCBQuMxjtlZWVhwIAB+OKLL/J0Gz7J398fMTExpoZuEm6tWQBrOVtciKiMZGQA69cDRf3HKDsbiIzMKW9nZ/YwPDw80KNHDyxbtgxCCPTo0QMeHh7FurZ+/fqGz2UyGXx8fBAfH284tnz58kKvzx1b8+SKqo/7/PPPsWrVKuzevTtPuZo1a+L48eNITk7G2rVrMXToUOzZswd16tTBsWPH8H//9384fvx4qVbWFUJg5MiRhlYFOzs7/Pjjj+jZsyeOHDlSYGL29ddf49ChQ9iwYQOCg4Oxd+9ejBw5Er6+vujYsSM2bNiAnTt34sSJEybH9rjffvsNKSkpOHXqFN577z3MnTsX77//fpHX3bp1C127dsULL7yA119/3XD8ww8/RHh4OAYNGlTkrCE7O7tSLd9vCiYuBchdhI6ziojI7JKTi05acun1OeXLIHEBgFdffRWjR48GAHz77bfFvu7JlU9lMlmJpsa6u7tDJpPh/v37+Z6fO3cuZs2ahR07dhglSblsbGxQo0YNWFlZoXHjxjhy5Aj+7//+D4sXL8a+ffsQHx9v1Fqg0+nwzjvvYP78+cVuIdi5cyc2btyI+/fvG5alX7hwIbZv345ly5Zh4sSJea7JyMjARx99hMjISPTo0QNATpJ38uRJzJ07Fx07dsTOnTtx5cqVPK02zz//PFq3bm3UclUcgYGBAIA6depAp9Phf//7H9555508Gxs+7tatW2jXrh2aN2+O77//Ps/7joqKwh9//AHg0UaLHh4e+Pjjj432DExMTISnp2eJ4i0tJi4FyF2EjrOKiMjsVCrAyqp4yYuVVU75MtK1a1fDVNjHx2CUNRsbG9SpUwdnz57Ns47LF198gRkzZmDr1q1FjoHJJYQw7GU3ePDgPF1LXbp0weDBgzF8+PBix5jbkvDkGA8rK6sCkzStVgutVlvoqvATJ040auEAcra8+eqrr9CrV69ix5cf8XA3ZlHINoQ3b95Eu3bt8PTTT2PJkiV5Yl27dq2hRUyv12Pfvn0YPXo09u3bh+rVqxvKZWZm4sqVK2jUqFGpYi4pJi4FUFg/bHHhGBciMjc7O6BPH+DPP/MOzH2ctXVOuTJqbQFy/qCeO3fO8Lm5DBkyBP7+/pg9e3aBZbp06YL9+/cbLW73+eef45NPPsHKlSsREhJimHbs6OgIR0dHAMDHH3+M1q1bIywsDGlpaVi9ejV2796NLVu2AMhpzXF3dzd6lkKhgI+PD2rXrm04FhcXh7i4OFy+fBkAEBUVBScnJwQFBcHNzQ3NmzeHq6srhg4dismTJ8POzg4//PADrl69amhNAYCwsDDMnj0bzz33HFQqFdq0aYP33nsPdnZ2CA4Oxp49e7B8+XLMmzcPAODj45PvgNygoCCEhoYWu45//fVXKBQK1KtXD0qlEseOHcOHH36Il156CdbWOX/eDx8+jCFDhuDvv/+Gv78/bt26hbZt2yIoKAhz585FQkKC4X65MT2enOj1esTGxgIAwsPDjVqJDh06BKVSaTQoujwwcSmANVtciKgsTZgAFLXgmE4HjB9f5qGUdHfe4oiNjS1yU7433ngDTz31FJKSkuDs7AwgpytGo9Ggf//+RmWnTJmCqVOnAgDu3LmDESNG4M6dO3B2dkb9+vWxZcsWdOrUqUQxfvfdd0bdHs8++ywAYMmSJRg2bBg8PDywZcsWfPzxx2jfvj20Wi0iIiKwfv16NGjQwHDdhQsXkJSUZHi9evVqfPjhhxg4cCASExMRHByMmTNn5rvgX2Hatm2LkJAQLF26NN/z1tbW+Oyzz3Dx4kUIIRAcHIxRo0Zh/GPfM+np6bhw4YJhUbpt27bh8uXLuHz5MgICAozuV1grTX5WrVqFgQMHwt7evkTXlVqJJ1BbkLJcx6X/on9E8AcbxabTt0obJj2Ga4uUH9Z12TLLOi6LFkmyjosleeGFF8SsWbNKdI3J9V3BBAcHiyVLlkgaQ0F1HR8fL9zc3MR///1X4LVcx6WcPVrHhV1FRFRGRowA9u3L6Q7KbZ2wssp5vW9fzvlK7osvvjB0AdEj58+fh5OTE4YMGSJ1KPm6evUqFi5cWKKuLXNhV1EBFNbsKiKictCyZc5HRkbO7CGVqkzHtFia4OBgjBkzRuowLE5YWBiioqKkDqNATZs2RdOmTSV5NhOXAiisuAAdEZUjO7sqlbAQmYpdRQXIXcdFwxYXIiIii8HEpQDWht2h2eJCRAUTJZyJQVRVlNXPBhOXAhi6itjiQkT5yF05tryXOyeqKHJ/Np5cZbm0OMalAIqHLS4atrgQUT7kcjlcXFwQHx8PvV4PvV6PzMzMItcuodLT6/XQaDSs73JgSl0LIZCeno74+Hi4uLiYdWFDgIlLgR51FbHFhYjyl7vSaEJCAjIyMmBnZ1eqTf2oeIQQrO9yUpq6dnFxyXeF4NJi4lIAhZyzioiocDKZDL6+vnB1dcXff/+NZ5991uzN4pSXVqvF3r17Wd/lwNS6VigUZm9pycXEpQCPFqBjiwsRFU4ulyM7Oxu2trb8Q1oOWN/lxxLrmp2DBTBsssgxLkRERBaDiUsBFFacDk1ERGRpmLgUIHcBOq2eXUVERESWgolLARRcgI6IiMjiMHEpQO6sIg7OJSIishxMXArABeiIiIgsDxOXAhgSl2wmLkRERJaCiUsBbKxz13Fh4kJERGQpmLgUQGnNFhciIiJLw8SlADbsKiIiIrI4TFwKkNtVxMG5REREloOJSwFs2FVERERkcZi4FIDToYmIiCwPE5cCsMWFiIjI8jBxKQAH5xIREVkeJi4FUHJwLhERkcVh4lIAdhURERFZHiYuBeDKuURERJaHiUsBcmcVaXUCej13iCYiIrIETFwKkNviAnCcCxERkaVg4lKA3FlFABMXIiIiS8HEpQBGiQsH6BIREVkEJi4FsLKSQSGXAeAAXSIiIkvBxKUQCi5CR0REZFGYuBSCa7kQERFZFiYuhcgd55LFxIWIiMgiMHEphA2X/SciIrIoTFwKYVg9ly0uREREFoGJSyEMO0SzxYWIiMgiMHEpBAfnEhERWRYmLoWw4XRoIiIii8LEpRAcnEtERGRZmLgUgl1FREREloWJSyE4OJeIiMiyMHEpBFtciIiILAsTl0JwcC4REZFlYeJSCLa4EBERWRZJE5eQkBDIZLI8H6NGjZIyLAPDyrkc40JERGQRrKV8+JEjR6DT6Qyvz5w5g06dOuGFF16QMKpHDJssMnEhIiKyCJImLp6enkav58yZg+rVq6NNmzYSRWRMqXiYuGiZuBAREVkCSROXx2k0GqxYsQITJkyATCbLt0xWVhaysrIMr5OTkwEAWq0WWq3W5GfnXvvkPawfhpGhyS7V/emRguqazI91XX5Y1+WL9V1+yqquS3M/mRBCmDEWk/3+++945ZVXEBsbCz8/v3zLTJ06FdOmTctzfOXKlbC3tzd7TDtvybD+mhxNPPQYVJOtLkREROaQnp6OV155BUlJSVCpVCW61mISly5dusDGxgZ//vlngWXya3EJDAzE3bt3S/zGH6fVarF9+3Z06tQJCoXCcPyXQ7GYvuk8ukV44+uXG5h8f3qkoLom82Ndlx/WdflifZefsqrr5ORkeHh4mJS4WERX0bVr17Bjxw6sW7eu0HJKpRJKpTLPcYVCYZYKffI+DrY5n2t0gj8cZmaurxkVjXVdfljX5Yv1XX7MXdeluZdFrOOyZMkSeHl5oUePHlKHYkRpLQcAZHEdFyIiIosgeeKi1+uxZMkSDB06FNbWFtEAZGD7cFZRplZXREkiIiIqD5InLjt27EBsbCxeffVVqUPJgy0uRERElkXyJo7OnTvDQsYH56FkiwsREZFFkbzFxZKxxYWIiMiyMHEpBMe4EBERWRYmLoVgi0vVMXv2bDRp0gROTk7w8vJC3759ceHCBaMyU6dORVhYGBwcHODq6oqOHTvi33//zfd+Qgh069YNMpkMarXa6NzMmTPRokUL2Nvbw8XFJd/rjxw5gg4dOsDFxQWurq7o3LkzTp48Weh7iIuLw+DBg+Hj4wMHBwc0bdoUBw4cyLdsVlYWGjZsCJlMVuR9y9r+/fvRsmVLuLu7w87ODmFhYfjqq68KvebUqVMYMGAAAgMDYWdnh/DwcPzf//1fgeUvX74MJyenAuubiCoOJi6FYItL1bFnzx6MGjUKhw4dwvbt25GdnY3OnTsjLS3NUKZWrVr45ptvEBUVhf379yMkJASdO3dGQkJCnvvNnz+/wK0rNBoNXnjhBbz11lv5nk9JSUGXLl0QFBSEf//9F/v374dKpUKXLl0KXSZ78ODBuHDhAjZs2ICoqCj07dsXc+fOxYkTJ/KUff/99wtcobq8OTg4YPTo0di7dy/OnTuHSZMmYdKkSfj+++8LvObYsWPw9PTEihUrEB0djY8//hgffvghvvnmmzxltVotBgwYgNatW5fl2yCi8iIqsKSkJAFAJCUlleo+Go1GqNVqodFojI7HJ2eK4A82iuAPNgq9Xl+qZ1COguq6JOLj44W3t7eYOXOm4dihQ4eEQqEQW7duNUeYIj4+XgAQe/bsKbBM7vffjh07jI6fPHlSBAQEiNu3bwsAIjIyMt/rlyxZIpydnfMcP3LkiAAgYmNjDcdOnz4tAIjLly8XGI+Dg4NYvny54bVGoxFOTk5i8eLFRuU2b94swsLCRHR0tAAgTpw4UeA9n3T16lUhk8nEkSNHjI5//fXXIigoyGw/J88995wYNGhQia4ZOXKkaNeuXZ7j77//vhg0aFCB9W0O5vi+puJjfZefsqrr0vz9ZotLIXJbXAB2F1kST09P/Pzzz5g6dSqOHj2K1NRUDBo0CCNHjkTnzp0BAPv27YOjo2OhH7NmzSrwGUlJSQAANze3fM9rNBp8//33cHZ2RoMGj7aDSE9Px4ABA/DNN9/Ax8fHpPdXu3ZteHh44KeffoJGo0FGRgZ++uknREREIDg4uMDrWrVqhd9++w2JiYnQ6/X47bffoNVq8eyzzxrK3LlzB2+88QZ++eUXk/b3CgkJQceOHbFkyRKj40uWLMGwYcMMrUxF1X23bt0KfMaJEydw4MCBEu8Sn5SUlOfrtXPnTqxZswbffvttie5FRJZL8unQlix3jAuQk7jYKuSFlKby1L17d7zxxhsYOHAgmjRpAltbW8yZM8dwvnHjxkWO3SgoKRFCYMKECWjVqhXq1q1rdG7jxo14+eWXkZ6eDl9fX2zfvh0eHh6G8+PHj0eLFi3Qp08fk9+bk5MTdu/ejT59+uDTTz8FkNNNtXXr1kIXafztt9/w0ksvwd3dHdbW1rC3t8fEiRNRvXp1w/saNmwYRowYgcaNGyMmJsak+F5//XWMGDEC8+bNg1KpxKlTp3Dy5EmjLTuKqns7O7s8xwICApCQkIDs7GxMnToVr7/+erFjOnjwIH7//Xds2rTJcOzevXsYNmwYVqxYUaq9zIjIsjBxKYRCLoOVDNALIEurA+y4J4YlmTt3LurWrYvff/8dR48eha2treGcnZ0datSoYdJ9R48ejdOnT2P//v15zrVr1w4nT57E3bt38cMPP+DFF1/Ev//+Cy8vL2zYsAE7d+7Md0xJSWRkZODVV19Fy5YtsWrVKuh0OsydOxfdu3fHkSNH8v2jDwCTJk3C/fv3sWPHDnh4eGDt2rX4/PPP0atXLzz11FNYsGABkpOT8eGHH5Yqvr59+2L06NGIjIzEyy+/jJ9//hnt2rVDSEiIoYwpdb9v3z6kpqbi0KFDmDhxImrUqIEBAwYUeV10dDT69OmDyZMno1OnTobjb7zxBl555RWjFiciqgTM2mlVzsp6jIsQQoRN+ksEf7BRxN5LK9UzKIc5+0vPnDkjbG1thVwuFxs2bDA6t3fvXuHg4FDox+NjZHKNHj1aBAQEiP/++69YMdSoUUPMmjVLCCHE2LFjhUwmE3K53PABQFhZWYk2bdrkubagMRc//vij8PLyEjqdznAsKytL2Nvbi1WrVuUbx+XLlwUAcebMGcMxjUYj6tevL9544w0hhBB9+vQRVlZWeeKTy+ViyJAhxXq/uSZMmCA6d+4ssrKyhIeHh1ixYoXR+aLqvmvXroXe/9NPPxW1atUqMo7o6Gjh5eUlPvroozznnJ2djd6rlZWV4f3+9NNPJXq/ReGYi/LF+i4/ljjGhS0uRbBVWCFDq+PMIguj0WgwcOBAvPTSSwgLC8Nrr72GqKgoeHt7Ayh5V5EQAmPGjEFkZCR2796N0NDQYsUhhEBWVhYAYOLEiXm6N+rVq4evvvoKvXr1KvZ7S09Ph5WVldGspNzXen3+Y63S09MN5R5nZWVluObrr7/GjBkzDOdu3bqFLl264LfffsMzzzxT7PiAnO6iunXrYuHChdBqtejXr5/ReVO6ih73eL0WJDo6Gu3bt8fQoUMxc+bMPOcPHjwIne7Rz+369evx2Wef4cCBA/D39y/03kRkuZi4FCFnnIuWg3MtzMcff4ykpCR8/fXXcHR0xF9//YXXXnsNGzduBFDyrqJRo0Zh5cqVWL9+PZycnBAXFwcAcHZ2hp2dHdLS0jBz5kz07t0bvr6+uHfvHhYuXIgbN27ghRdeAAD4+PjkOyA3KCjIKBGKjY1FYmIiYmNjodPpDH/ka9SoAUdHR3Tq1AnvvfceRo0ahTFjxkCv12POnDmwtrZGu3btAAA3b95Ehw4dsHz5cjRt2hRhYWGoUaMG3nzzTcydOxfu7u5Yu3YtTp06hWnTphnieJyjoyMAoHr16ggICCh2XQFAeHg4mjVrhg8++ACvvvpqnkSkJHX/7bffIigoCGFhYQBy1nWZO3cuxowZYygTGRmJDz/8EOfPnweQk7S0a9cOnTt3xoQJEwxfL7lcDk9PT0OMjzt69CisrKzyjFsiooqFs4qKwLVcLM/u3bsxf/58/PLLL1CpVLCyssIvv/yC/fv3Y9GiRSbdc9GiRUhKSkLbtm3h6+tr+Pjtt98A5PxBPH/+PJ5//nnUqlULPXv2REJCAvbt24eIiIgSPWvy5Mlo1KgRpkyZgtTUVDRq1AiNGjXC0aNHAQBhYWH4888/cfr0aTRv3hytW7fGrVu3sGXLFvj6+gLIWZvkwoULhpYWhUKBzZs3w9PTE7169UL9+vWxYsUKvP3224XO4MlPSEgIpk6dWmS51157DRqNptQbpOr1enz44Ydo2LAhGjdujAULFmDOnDmYPn26oUxSUpLRgoBr1qxBQkICfv31V6OvV5MmTUoVCxFZPpkQFrrDYTEkJyfD2dkZSUlJpZo1oNVqsXnzZnTv3h0KhfEA3C5f7cWFOyn49fVn0LKGRwF3oOIqrK7JvEyp64yMDLi5uWHz5s2G1p2CzJw5E6tXr0ZUVJQ5wq3Q+H1dvljf5aes6ro0f7/Z4lIEtrhQVbJnzx60b9++0KQlNTUVR44cwYIFC/D222+XY3RERExcisT9iqgq6dq1q9FaKPkZPXo0WrVqhTZt2pS6m4iIqKQ4OLcISra4EBlZunQpli5dKnUYRFRFscWlCGxxISIishxMXIrAMS5UHG3btsW4ceOkDoOIqNJj4lKE3P2JMpi4kAV68OABRo0aBV9fX9ja2iI8PBybN282nNfpdJg8eTJCQ0NhZ2eHatWqYfr06QUuZPekf/75B9bW1mjYsGGBZVavXg2ZTIa+ffuW8t0QERWNY1yKYPcwccnUsquoKtJoNLCxsZE6jHxpNBp06tQJXl5e+OOPPxAQEIDr16/DycnJUGbdunXYsmULli1bhoiICBw9ehTDhw+Hs7Mzxo4dW+j9k5KSMGTIEHTo0AF37tzJt8y1a9fw7rvvonXr1mZ9b0REBWGLSxHsbR62uGiyJY6ECrN06VK4uLhg69atCA8Ph6OjI7p27Yrbt28bygwbNgx9+/bFtGnT4OXlBZVKhTfffBMajcZQpm3bthg9ejQmTJgADw8Pw6Z9e/bsQdOmTaFUKuHr64uJEyciO9v4eyI7OxujR4+Gi4sL3N3dMWnSJDy+TJJGo8H7778Pf39/ODg44JlnnsHu3btNfs8///wzEhMToVar0bJlSwQHB6NVq1Zo0KCBocyFCxfQq1cv9OjRAyEhIejfvz86d+5sWOyuMG+++SZeeeUVNG/ePN/zOp0OAwcOxLRp01CtWjWT3wcRUUkwcSkCu4oqjvT0dMydOxe//PIL9u7di9jYWLz77rtGZf7++2+cO3cOu3btwqpVqxAZGWlYEj/XsmXLYG1tjX/++QeLFy/GzZs30b17dzRp0gSnTp3CokWL8NNPPxnt+/P4df/++y++/vprfPXVV/jxxx8N54cPH45//vkHq1evxunTp/HCCy+ga9euuHTpEoCcrQAcHR0L/RgxYoThfhs2bEDz5s0xatQoeHt7o27dupg1a5bR/jzh4eHYtWsXLl68CAA4deoU9u/fj+7duxdal0uWLMGVK1cwZcqUAstMnz4dnp6eeO211wq9FxGRObGrqAh2hhYXdhVZOq1Wi++++w7Vq1cHkLPeyOPLxgOAjY0Nfv75Z9jb2yMiIgLTp0/He++9h08//dSwQWGNGjXw+eefG675+OOPERgYiG+++QYymQxhYWG4desWPvjgA0yePNlwXWBgIL766ivIZDLUrl0bUVFR+Oqrr/DGG2/gypUrWLVqFW7cuAE/Pz8AwLvvvostW7ZgyZIlmDVrFvz8/IrcnPDxFSb/++8/7Ny5EwMHDsTmzZtx6dIljBo1CtnZ2Zg8eTIAoF+/fvDx8UFYWBjkcjl0Oh1mzpyJAQMGFPiMS5cuYeLEidi3bx+srfP/FfHPP//gp59+KjJeIiJzY+JSBENXkZZdRZbO3t7ekLQAgK+vL+Lj443KNGjQAPb29obXzZs3R2pqKq5fv47g4GAAOTtLP+7cuXNo3ry50W7NLVu2RGpqKm7cuGHYvLBZs2ZGZZo3b44vv/wSOp0Ox48fhxACtWrVMrp3VlYW3N3dAQDW1tYl2pxQr9fDy8sL33//PeRyOZ5++mncunULX3zxhSFx2b9/P3777TesXLkSEREROHnyJMaNGwc/Pz8MHTo0zz11Oh1eeeUVTJs2LU+suVJSUjBo0CD88MMP8PDgNhhEVL6YuBTB0FWkYVeRpXtyHw2ZTIbibsX1eMLh4OBgdE4IYXQ+99iT1xVGr9dDLpfj2LFjkMvlRudyd2mOjY1FnTp1Cr3PoEGD8N133wHIScwUCoXR/cLDwxEXFweNRgOZTIalS5di8uTJePnllwEA9erVw7Vr1zB79ux8E5eUlBQcPXoUJ06cwOjRow2xCyFgbW2Nbdu2wc3NDTExMejVq5fR+wNykq8LFy4YJZBERObExKUIuS0u6UxcKoVTp04hIyMDdnZ2AIBDhw7B0dERAQEBBV5Tp04drF271iiBOXDgAJycnODv728od+jQIaPrDh06hJo1a0Iul6NRo0bQ6XSIj48vcAZOSbuKWrZsiZUrV0Kv1xu6qy5evAhfX1/Y2NhAq9VCo9EYzuWSy+UFTodWqVR5Nk1cuHAhdu7ciT/++AOhoaGQy+V5ykyaNAkpKSn4v//7PwQGBhb6HoiISoOJSxEeTYdm4lIZaDQavPbaa5g0aRKuXbuGKVOmYPTo0Xn+uD9u5MiRmD9/PsaMGYPRo0fjwoULmDJlCiZMmGB03fXr1zFhwgS8+eabOH78OBYsWIAvv/wSAFCrVi0MHDgQQ4YMwZdffolGjRrh7t272LlzJ+rVq4fu3buXuKvorbfewoIFCzB27FiMGTMGly5dwqxZs4w2PmzcuDHmzJmD0NBQRERE4MSJE5g3b57RHkMffvghbt68ieXLl8PKygp169Y1eo6XlxdsbW2Njj9ZxsXFJd/jRETmxsSlCHacVVSpdOjQATVr1sSzzz6LrKwsvPzyy5g6dWqh1/j7+2Pz5s1477330KBBA7i5uRmSn8cNGTIEGRkZaNq0KeRyOcaMGYP//e9/hvNLlizBjBkz8M477+DmzZtwd3dH8+bNi5zhU5DAwEBs27YN48ePR/369eHv74+xY8figw8+MJT53//+hwMHDmDkyJGIj4+Hn58f3nzzTcMYGAC4ffs2YmNjTYqBiKi8yURxBwFYoOTkZDg7OyMpKcmoCb2ktFotNm/ejO7du+cZJ3Ei9j6eW3gAAa522P9B+9KGXOUVVtdlbdiwYXjw4AHUanW5PlcqUtZ1VcO6Ll+s7/JTVnVdmr/fXMelCLnTodlVREREJD0mLkWwV+T0pnFWERERkfQ4xqUItjY5uV26VpfvtFiqOJYuXSp1CEREVEpscSlC7uBcIYCsbK6eS0REJCUmLkXITVwAjnMhIiKSGhOXIljLrWAjf9hdxHEuREREkmLiUgy2ipxq4louZEnS09OlDoGIqNwxcSkGexvOLCLLcvToUbi4uCAhIUHqUIiIyhUTl2Kws+HquWRZfvvtN7i6usLNzU3qUIiIyhUTl2Kw4w7RZEGEEIiMjESfPn3y7DRNRFTZMXEpBra4kCWJjo7GlStX0LdvX6lDISIqd0xcisH+YeKSrsmWOBIiQK1Ww9HREe3bc+8sIqp6TF459/r164iJiUF6ejo8PT0REREBpVJpztgsxqPEhS0uJD21Wo3u3bvD1tZW6lCIiMpdiRKXa9eu4bvvvsOqVatw/fp1PL6xtI2NDVq3bo3//e9/eP7552FlVXkacxwezipKy2KLC0krNjYWx44dwzvvvCN1KEREkih2djF27FjUq1cPly5dwvTp0xEdHY2kpCRoNBrExcVh8+bNaNWqFT755BPUr18fR44cKcu4y5W9MqfFJS2LLS4krfXr10OhUKB79+5Sh0JEJIlit7jY2NjgypUr8PT0zHPOy8sL7du3R/v27TFlyhRs3rwZ165dQ5MmTcwarFQclGxxIcsQGRmJ9u3bw9nZWepQiIgkUezE5Ysvvij2TSvb/wYNXUUc40ISunfvHvbu3YtvvvlG6lCIiCRj0kCUjIwMo+XGr127hvnz52Pr1q1mC8yScFYRWYJNmzZBp9OhT58+UodCRCQZkxKXPn36YPny5QCABw8e4JlnnsGXX36Jvn37YtGiRWYN0BI4squILEBkZCSaNWsGX19fqUMhIpKMSYnL8ePH0bp1awDAH3/8AW9vb1y7dg3Lly/H119/bdYALYG9IXFhVxFJIz09HVu3buWic0RU5ZmUuKSnp8PJyQkAsG3bNvTr1w9WVlZo1qwZrl27ZtYALYHDw66iNHYVkUS2b9+OjIwMPPfcc1KHQkQkKZMSlxo1akCtVuP69evYunUrOnfuDACIj4+HSqUya4CWgLOKSGqRkZEIDw9HrVq1pA6FiEhSJiUukydPxrvvvouQkBA888wzaN68OYCc1pdGjRqZNUBLkDuriCvnkhSys7Px559/srWFiAgmLvnfv39/tGrVCrdv30aDBg0Mxzt06FApf7nmLkCXyhYXksC+ffuQmJjI8S1ERCjFXkU+Pj7w8fExOta0adNSB2SJcmcVpWt0EEJAJpNJHBFVJWq1Gv7+/nj66aelDoWISHImJS6ZmZlYsGABdu3ahfj4eOj1eqPzx48fN0twliJ3HRedXiArWw9bhVziiKiqEEJArVajb9++lWr/LyIiU5mUuLz66qvYvn07+vfvj6ZNm1b6Fgh7m0fVlJaVzcSFys2JEycQGxvLbiIioodMSlw2bdqEzZs3o2XLluaOxyLJrWSwU8iRodUhXaODu9QBUZWhVqvh4uKCNm3aSB0KEZFFMKnt2d/f37COS2ndvHkTgwYNgru7O+zt7dGwYUMcO3bMLPc2JwcO0CUJREZGomfPnlAoFFKHQkRkEUxKXL788kt88MEHpV5s7v79+2jZsiUUCgX++usvnD17Fl9++SVcXFxKdd+yYG+YEs3EhcrH5cuXcebMGXYTERE9xqSuosaNGyMzMxPVqlWDvb19nv8NJiYmFus+n332GQIDA7FkyRLDsZCQEFNCKnO5i9ClZDJxofKxfv162NraomvXrlKHQkRkMUxKXAYMGICbN29i1qxZ8Pb2Nnlw7oYNG9ClSxe88MIL2LNnD/z9/TFy5Ei88cYb+ZbPyspCVlaW4XVycjIAQKvVQqvVmhRD7vWP/5sfx4ddRUlpWaV6VlVXnLqmHOvWrUOHDh1gY2NjUn2xrssP67p8sb7LT1nVdWnuJxNCiJJeZG9vj4MHDxotPmcKW1tbAMCECRPwwgsv4PDhwxg3bhwWL16MIUOG5Ck/depUTJs2Lc/xlStXwt7evlSxFOX781aIvm+Fl6vp0Ny7xFVGVCIPHjzA8OHDMWrUKHTs2FHqcIiIzCo9PR2vvPIKkpKSSrxVkEmJy1NPPYWFCxeiWbNmJb3UiI2NDRo3bowDBw4Yjr399ts4cuQIDh48mKd8fi0ugYGBuHv3bqn2SNJqtdi+fTs6depU4CDId9ZEYcPp25jYtRZeaxli8rOquuLUNQE///wzRo4cievXr8PT09Oke7Cuyw/runyxvstPWdV1cnIyPDw8TEpcTOoqmjNnDt555x3MnDkT9erVy/NmihuEr68v6tSpY3QsPDwca9euzbe8UqmEUqnMc1yhUJilQgu7j8o+53i6VvAHxQzM9TWrrDZs2IBWrVrBz8+v1PdiXZcf1nX5Yn2XH3PXdWnuZVLikjtYsEOHDkbHc5fD1+mKtxlhy5YtceHCBaNjFy9eRHBwsClhlSkn25xKTslknyqVrZSUFOzYsQNz5syROhQiIotjUuKya9cuszx8/PjxaNGiBWbNmoUXX3wRhw8fxvfff4/vv//eLPc3p9z9ilI5q4jK2F9//QWNRsNp0ERE+TApcTHXKp5NmjRBZGQkPvzwQ0yfPh2hoaGYP38+Bg4caJb7m5PKltOhqXyo1Wo0aNAAoaGhUodCRGRxip24xMbGIigoqNg3vnnzJvz9/Yss17NnT/Ts2bPY95WK48PEhSvnUlnSaDTYtGkTJkyYIHUoREQWqdgr5zZp0gRvvPEGDh8+XGCZpKQk/PDDD6hbty7WrVtnlgAthZPy4RgXJi5Uhnbt2oXk5GR2ExERFaDYLS7nzp3DrFmz0LVrVygUCjRu3Bh+fn6wtbXF/fv3cfbsWURHR6Nx48b44osv0K1bt7KMu9w5GrqKODiXyo5arUZISAjq168vdShERBap2C0ubm5umDt3Lm7duoVFixahVq1auHv3Li5dugQAGDhwII4dO4Z//vmn0iUtAOBky8G5VLb0ej3Wr1+P5557zuTVqImIKrsSD861tbVFv3790K9fv7KIx2IZuoqYuFAZOXz4MG7fvs1uIiKiQpi0O/TSpUuRkZFh7lgsWm6LS4ZWh2ydXuJoqDJSq9Xw8PBAy5YtpQ6FiMhimZS4fPjhh/D29sZrr71mtFx/ZZY7xgXgzCIyPyEEIiMj0bt3b8jlcqnDISKyWCYlLjdu3MCKFStw//59tGvXDmFhYfjss88QFxdn7vgshkJuBVtFTnWxu4jM7fz587h48SK7iYiIimBS4iKXy9G7d2+sW7cO169fx//+9z/8+uuvCAoKQu/evbF+/Xro9ZWvOyV32f9kziwiM1Or1XBwcOBO0ERERTApcXmcl5cXWrZsiebNm8PKygpRUVEYNmwYqlevjt27d5shRMvhbJeTuCRlMHEh84qMjETXrl1hZ2cndShERBbN5MTlzp07mDt3LiIiItC2bVskJydj48aNuHr1Km7duoV+/fph6NCh5oxVcrnL/idnsKuIzOfGjRs4cuQIu4mIiIrBpL2KevXqha1bt6JWrVp44403MGTIELi5uRnO29nZ4Z133sFXX31ltkAtQW6LSzJbXMiMNmzYAGtra/To0UPqUIiILJ5JiYuXlxf27NmD5s2bF1jG19cXV69eNTkwS8SuIioLkZGRaNu2LVxdXaUOhYjI4pmUuPz0009FlpHJZAgODjbl9haLiQuZ2/3797F7927Mnz9f6lCIiCoEk8a4vP322/j666/zHP/mm28wbty40sZksVR2nFVE5rVp0yZkZ2ejT58+UodCRFQhmJS4rF27Nt/VPVu0aIE//vij1EFZKra4kLmp1Wo0adIEAQEBUodCRFQhmJS43Lt3D87OznmOq1Qq3L17t9RBWSoVExcyo4yMDGzZsgXPPfec1KEQEVUYJiUuNWrUwJYtW/Ic/+uvv1CtWrVSB2WpVLZMXMh8duzYgbS0NE6DJiIqAZMG506YMAGjR49GQkIC2rdvDwD4+++/8eWXX1bqQYacDk3mpFarUatWLYSFhUkdChFRhWFS4vLqq68iKysLM2fOxKeffgoACAkJwaJFizBkyBCzBmhJHo1x4QJ0VDrZ2dnYsGEDXnvtNchkMqnDISKqMExKXADgrbfewltvvYWEhATY2dnB0dHRnHFZJGf7Ry0uQgj+wSGTHThwAHfv3mU3ERFRCZmcuOTy9PQ0RxwVQu6S/xqdHplaPexs5BJHRBWVWq2Gr68vmjZtKnUoREQVikmDc+/cuYPBgwfDz88P1tbWkMvlRh+VlaPSGtZWOa0sDzI0EkdDFZUQApGRkejTpw+srEq9zykRUZViUovLsGHDEBsbi08++QS+vr5VpstEJpPB1cEGCSlZuJeqga8zd/Klkjt9+jRiYmLYTUREZAKTEpf9+/dj3759aNiwoZnDsXzuDxOX++lscSHTqNVqqFQqtGvXTupQiIgqHJPaqQMDAyGEMHcsFYKrvQ0AIDGNiQuZJjIyEj169ICNjY3UoRARVTgmJS7z58/HxIkTERMTY+ZwLJ+bAxMXMt3Vq1dx6tQpdhMREZnIpK6il156Cenp6ahevTrs7e2hUCiMzicmJpolOEuUm7jcZ+JCJlCr1bCxsUG3bt2kDoWIqEIyKXGpzKvjFsU1t8WFY1zIBGq1Gh07doSTk5PUoRARVUgmJS5Dhw41dxwVhtvDRejYVUQllZCQgP379+O7776TOhQiogrL5EUkrly5gkmTJmHAgAGIj48HAGzZsgXR0dFmC84SuTkqATBxoZL7888/IYRA7969pQ6FiKjCMilx2bNnD+rVq4d///0X69atQ2pqKoCc9SmmTJli1gAtjZt97hgXbrRIJaNWq9GiRQt4e3tLHQoRUYVlUuIyceJEzJgxA9u3bzea0tmuXTscPHjQbMFZIleHnK6ie2xxoRJITU3Ftm3b8Nxzz0kdChFRhWZS4hIVFZXvL2BPT0/cu3ev1EFZMneHnK6i++maKruWDZXc1q1bkZWVhT59+kgdChFRhWZS4uLi4oLbt2/nOX7ixAn4+/uXOihL5vJwcK5OL5CcmS1xNFRRqNVq1K1bFzVq1JA6FCKiCs2kxOWVV17BBx98gLi4OMhkMuj1evzzzz949913MWTIEHPHaFFsFXI4PNwVmgN0qTi0Wi02btzIbiIiIjMwKXGZOXMmgoKC4O/vj9TUVNSpUwfPPvssWrRogUmTJpk7Rovj5sjVc6n49uzZgwcPHnC1XCIiMzBpHReFQoFff/0Vn376KY4fPw69Xo9GjRqhZs2a5o7PIrnZ2+B6YgZXz6ViUavVCAoKQqNGjaQOhYiowjOpxWX69OlIT09HtWrV0L9/f7z44ouoWbMmMjIyMH36dHPHaHFcuV8RFZNer4darUbfvn0hk8mkDoeIqMIzKXGZNm2aYe2Wx6Wnp2PatGmlDsrSuXHZfyqmY8eO4ebNm+wmIiIyE5MSFyFEvv97PHXqFNzc3EodlKV7tAgdExcqnFqthpubG1q3bi11KERElUKJxri4urpCJpNBJpOhVq1aRsmLTqdDamoqRowYYfYgLU1uVxEXoaOiREZGolevXrC2Nmk4GRERPaFEv03nz58PIQReffVVTJs2Dc7OzoZzNjY2CAkJQfPmzc0epKVxd2CLCxXtwoULOHfuHGbNmiV1KERElUaJEpfcXaFDQ0PRokULKBSKMgnK0rlyjAsVg1qthp2dHTp37ix1KERElYZJ7ddt2rQxfJ6RkQGt1njDQZVKVbqoLFxui8u9VCYuVDC1Wo0uXbrA3t5e6lCIiCoNkwbnpqenY/To0fDy8oKjoyNcXV2NPio7T6ec/YoSUrK4XxHl6/bt2zh06BBnExERmZlJict7772HnTt3YuHChVAqlfjxxx8xbdo0+Pn5Yfny5eaO0eJ4OdkCADK0OqRkcb8iymv9+vWQy+Xo2bOn1KEQEVUqJnUV/fnnn1i+fDnatm2LV199Fa1bt0aNGjUQHByMX3/9FQMHDjR3nBbFzkYOJ1trpGRmIz45CyrbqjnWhwqmVqvx7LPPwt3dXepQiIgqFZNaXBITExEaGgogZzxLYmIiAKBVq1bYu3ev+aKzYN6qnFaX+ORMiSMhS5OUlISdO3dyU0UiojJgUuJSrVo1xMTEAADq1KmD33//HUBOS8zjU6QrM29VzjiXOylMXMjY5s2bodVq0adPH6lDISKqdExKXIYPH45Tp04BAD788EPDWJfx48fj/fffN2uAlip3nEt8cpbEkZClUavVeOqppxAUFCR1KERElY5JY1zGjx9v+Lxdu3Y4f/48jh49Ck9PTyxZssRswVkyr9wWFyYu9JjMzExs3rwZH3zwgdShEBFVSia1uDwpKCgI/fr1g0qlwrJly8xxS4vn/bDFhV1F9LidO3ciNTWV06CJiMqIWRKXqii3xYWDc+lxarUaNWrUQEREhNShEBFVSkxcTGSYVZTCriLKodPpsH79evTt2zff3dOJiKj0mLiYyNBVlJzJ1XMJAHDo0CHEx8ezm4iIqAyVaHBuv379Cj3/4MGD0sRSoeR2FWVq9UjOzIazHRehq+oiIyPh7e2NZs2aSR0KEVGlVaLEpag1WpydnTFkyJBSBVRR2CrkUNlaIzkzGwkpmUxcqjghBNRqNXr37g25XC51OERElVaJEhdzT3WeOnUqpk2bZnTM29sbcXFxZn1OWfFW2SI5MxV3krNQw8tJ6nBIQtHR0bhy5Qq+/vprqUMhIqrUTFrHxZwiIiKwY8cOw+uK9L9Vb5UtLsWn4g5nFlV5kZGRcHR0RIcOHaQOhYioUpM8cbG2toaPj4/UYZjEy4mL0FEOtVqN7t27Q6lUSh0KEVGlJnnicunSJfj5+UGpVOKZZ57BrFmzUK1atXzLZmVlISvrUZKQnJwMANBqtdBqtSbHkHttSe/h4ZgzriUuKb1Uz69KTK1rSxYbG4vjx49j/PjxFvW+KmNdWyrWdflifZefsqrr0txPJiScy/vXX38hPT0dtWrVwp07dzBjxgycP38e0dHRcHd3z1M+vzExALBy5UrY29uXR8hG9tyWYV2MHA3d9BheW1/uzyfLsHHjRixduhTLli2Dg4OD1OEQEVm89PR0vPLKK0hKSoJKpSrRtZImLk9KS0tD9erV8f7772PChAl5zufX4hIYGIi7d++W+I0/TqvVYvv27ejUqRMUiuLPDtp+Nh4jV51E/QAV1r7JKbDFYWpdW7LOnTvDxsYGGzdulDoUI5Wxri0V67p8sb7LT1nVdXJyMjw8PExKXCTvKnqcg4MD6tWrh0uXLuV7XqlU5juGQKFQmKVCS3qfIA9HAMCtB5n84Skhc33NpHbv3j3s27cP3377rcW+n8pS1xUB67p8sb7Lj7nrujT3sqiVc7OysnDu3Dn4+vpKHUqxBLrmdE/dTdUgQ6OTOBqSwsaNG6HT6dC7d2+pQyEiqhIkTVzeffdd7NmzB1evXsW///6L/v37Izk5GUOHDpUyrGJT2VnDSZnTaHXzQYbE0ZAU1Go1mjVrVmGSbSKiik7SxOXGjRsYMGAAateujX79+sHGxgaHDh1CcHCwlGEVm0wmg7+rHQDgxv10iaOh8paeno6tW7fiueeekzoUIqIqQ9IxLqtXr5by8WYR4GqH83EpuHGfLS5VzbZt25CRkcFNFYmIypFFjXGpiAIejnNhV1HVo1arUadOHdSqVUvqUIiIqgwmLqUUYOgqYuJSlWRnZ+PPP/9kawsRUTlj4lJK/i4c41IV7du3D4mJiUxciIjKGROXUjJ0FbHFpUqJjIyEv78/GjduLHUoRERVChOXUsrtKopPyUKmlmu5VAVCCKjVavTt2xcymUzqcIiIqhQmLqXkYq+AvY0cAHCLA3SrhBMnTuD69evsJiIikgATl1KSyWSGVhfOLKoaIiMj4eLigjZt2kgdChFRlcPExQxyx7lwZlHVoFar0bNnT+6RQkQkASYuZpDb4nLtHmcWVXaXL1/GmTNnuFouEZFEmLiYQaiHAwAg5m6axJFQWVOr1bC1tUWXLl2kDoWIqEpi4mIGuYnLVSYulZ5arUanTp3g4OAgdShERFUSExczqObhCAC4ei8Ner2QOBoqK3fu3MGBAwfYTUREJCEmLmbg72oHG7kVNNl6ziyqxDZs2ACZTIaePXtKHQoRUZXFxMUM5FYyBLvnzCxid1HlpVar0apVK3h6ekodChFRlcXExUw4zqVyS05Oxo4dO9hNREQkMSYuZhLqycSlMtuyZQs0Gg1XyyUikhgTFzOp9rDF5T8mLpWSWq1Gw4YNERISInUoRERVGhMXMwl9OLPov4RUiSMhc9NoNNi0aRNbW4iILAATFzPJHeNy80EGd4muZHbt2oXk5GQmLkREFoCJi5l4ONrASWkNIYDYRC79X5lERkYiNDQU9evXlzoUIqIqj4mLmchkMlR7OED3cjy7iyoLvV6P9evXo2/fvpDJZFKHQ0RU5TFxMaNa3k4AgAtxKRJHQuZy+PBhxMXFcRo0EZGFYOJiRrV9chKX83HJEkdC5hIZGQkPDw+0aNFC6lCIiAhMXMwqzEcFgC0ulYUQApGRkejduzfkcrnU4RAREZi4mFVui8u1xHSka7IljoZK6/z587h06RK7iYiILAgTFzPydFLCw9EGQgCX7nCAbkUXGRkJBwcHdOjQQepQiIjoISYuZsZxLpWHWq1G165dYWdnJ3UoRET0EBMXM6vtnTPO5TzHuVRoN27cwJEjR9hNRERkYZi4mFmYD6dEVwbr16+HtbU1unfvLnUoRET0GCYuZhbmm9tVlAIhhMTRkKnUajXatWsHV1dXqUMhIqLHMHExs5peTrCSAYlpGiSkZEkdDpng/v372L17N/cmIiKyQExczMzORo7qnjk7RZ++kSRxNGSKTZs2ITs7G3369JE6FCIiegITlzJQP8AFAHD6xgNJ4yDTqNVqNG3aFP7+/lKHQkRET2DiUgYaBDoDAE6xxaXCycjIwF9//cVuIiIiC8XEpQw83uLCAboVy44dO5Cens5p0EREFoqJSxkI93WCQi7D/XQtbtzPkDocKoHIyEjUrl0bYWFhUodCRET5YOJSBpTWcoT75ixEd4rjXCqM7OxsbNiwgd1EREQWjIlLGakfkDPOhTOLKo4DBw7g3r177CYiIrJgTFzKSO44l1PXH0gaBxVfZGQkfH190aRJE6lDISKiAjBxKSMNA10AAFE3k5Ct00sbDBVJCAG1Wo2+ffvCyoo/FkREloq/octIDU9HONspkK7RIfoWd4q2dKdPn0ZMTAzHtxARWTgmLmXEykqGJiE5+9wciUmUOBoqSmRkJJydndG2bVupQyEiokIwcSlDTULcAAD/XmXiYunUajV69OgBGxsbqUMhIqJCMHEpQ01CcxKXozGJ0Ou5EJ2lunr1Kk6dOsVuIiKiCoCJSxmq6+cMW4UV7qdrcSUhVepwqABqtRpKpRJdu3aVOhQiIioCE5cyZGNthaeCcsa5sLvIcqnVanTs2BFOTk5Sh0JEREVg4lLGcse5HGbiYpESEhKwf/9+dhMREVUQTFzKWLNq7gCAA1fucpyLBfrzzz8hhEDv3r2lDoWIiIqBiUsZezrYFfY2ctxN1eBcHNdzsTRqtRotW7aEl5eX1KEQEVExMHEpYzbWVmj+sNVl78W7EkdDj0tNTcW2bdvYTUREVIEwcSkHrWt6AAD2XUqQOBJ63NatW5GVlcXEhYioANk6PTJ1UkdhzFrqAKqC1rU8AQBHY+4jXZMNextWuyWIjIxEvXr1UL16dalDISKSXKZWh4t3UhB9KxlnbiYh+lYyzt1ORjNPK/STOrjH8C9oOajm4QB/FzvcfJCBf68mol1tjqeQmlarxcaNGzF27FipQyEiKnepWdk4d/tRgnLmZhIux6ciO59JJHfSJQiwEExcyoFMJsOztTyw6vB17Dofz8TFAuzZswdJSUnsJiKiSi8xTYPoW48SlLO3knH1XhpEPhNdXe0ViPBzRoS/ChF+zgjzskf0v3vKP+hCMHEpJx3CvLHq8HVsP3sH03pHQCaTSR1SlRYZGYng4GA0bNhQ6lCIiMxCCIG45ExE30zGmYeJSvTNJNxKysy3vI/KFnX9Vajj54y6fipE+DvDz9nW6O+TVqvFOQv7c8XEpZy0qukBexs5bidl4szNZNQLcJY6pCpLr9dj/fr16N+/PxNIIqqQ9HqB2MR0Q4KS25JyL02Tb/kQd3ujlpQIPxU8HJXlHLV5MHEpJ7YKOdrU8sRfZ+Kw7WwcExcJHTt2DDdv3mQ3ERFVCNk6PS4npBq1pJy9lYzUrOw8ZeVWMtTwdDQkKHX9VAj3U0Flq5Ag8rJhMYnL7Nmz8dFHH2Hs2LGYP3++1OGUic4R3jmJS/QdvNO5ttThVFmRkZFwd3dHq1atpA6FiMhIplaHC3EpRl095+JSoMnW5ylrY22FcB+nnK6e3DEpPk6wVcgliLz8WETicuTIEXz//feoX7++1KGUqfa1vSG3kuHCnRTE3E1DiIeD1CFVSWq1Gr169YK1tUV8+xNRFZWh0eFcXE43T9SNJETdTMKl+FTo8pnZ46i0Rh1f1aOWFH8Vqns6QiGvesuxSf6bOzU1FQMHDsQPP/yAGTNmSB1OmXK2V6B5NXfsv3wXm6JuY1S7GlKHVOVcuHAB586dw+zZs6UOhYiqkHRNNs7eSkbUzSScuflw+nFC/kmKq70Cdf2dDQlKhJ8zgt3sYWXFMXmABSQuo0aNQo8ePdCxY8dKn7gAQO8Gfth/+S42nLzFxEUCarUa9vb26Ny5s9ShEFEllZqVjeibSTjzcNBs1M0kXElIzXf6sYejDer6O6OevzPqPvx4cmYPGZM0cVm9ejWOHz+OI0eOFKt8VlYWsrKyDK+Tk3M2LdRqtdBqtSbHkXttae5RXB1qu0Mhz+kuirqeiDAfpzJ/piUpz7rOT2RkJDp16gRra2vJYigvUtd1VcK6Ll+WVN8pmVqcvZ3yMElJxtnbybh6Lz3fJMXLSYkIPydE+KoeTj9WwdtJmSdJyc7OO+hWKmVV16W5n0yI/Kq37F2/fh2NGzfGtm3b0KBBAwBA27Zt0bBhwwIH506dOhXTpk3Lc3zlypWwt7cvy3DN6qcLVjidaIUOfnr0Ds474IrKRmJiIl599VWMHTsW7dq1kzocIqpg0rOB62ky3EjN+fd6mgx3M/NvGXGxEQhwEAh0EAh0BAIcBJxtyjlgC5aeno5XXnkFSUlJUKlUJbpWssRFrVbjueeeg1z+aPSzTqeDTCaDlZUVsrKyjM4B+be4BAYG4u7duyV+44/TarXYvn07OnXqBIWi7KeMbYm+gzGrT8HX2Ra7J7SuUv2W5V3Xj/v+++8xduxY3Lx5E25ubuX6bClIWddVDeu6fJVHfd9P1yD61sN9e24lI/pWMq7fz8i3rJ+zLSL8Hrai+DlV6DVSnlRWdZ2cnAwPDw+TEhfJuoo6dOiAqKgoo2PDhw9HWFgYPvjggzxJCwAolUoolXm/GRQKhVkq1Fz3KUqnCF842UbjdlImjl5PRssaHmX+TEtTXnX9uD///BNt2rSBt7d3uT5XalLUdVXFui5f5qrve6lZiHq4Z0/u7J6bD/JPUgLd7FDv4cDZ3HEpbg6VvynF3N/bpbmXZImLk5MT6tata3TMwcEB7u7ueY5XNrYKOfo29Mcvh65h1eHYKpm4lLekpCTs3LkT8+bNkzoUIpJQfErOkvhRDwfNFrYkfrC7/aOBsw9n+LjYV/4kxdJJPquoqnq5aSB+OXQNW6PjcC81C+6VpFnRUm3evBlarRZ9+vSROhQiKid3kjMNLSjRt3L+vZOclW/Zah4OD2f1qAxTkZ3t2HpmiSwqcdm9e7fUIZSbCD9nNAhwxqkbSVh7/Ab+92x1qUOq1NRqNZ5++mkEBgZKHQoRmZkQ4uE+cEmG6cdnbiUjISVvkiKTAdU9HVHXT2VoTanjp4JTJVoSv7KzqMSlqnm5aRBO3YjCqsPX8XqralVqkG55yszMxObNmzFx4kSpQyGiUhJC4OaDDJy6J8P57ZdwNi4VZ24m5bu5oJUMqOHlmNOS4ueMegHOqOOrgoOSf/oqMn71JNS7gR9mbTqHq3fTsPtiPNqHVa1Bo+Vl586dSE1N5aaKRBWMEALXEzNw5mE3T26Lyv10LQA5cPGqoazcSoaaD5OU3EGz4b5OsLfhn7nKhl9RCTkorTHgmSB8v/c//LjvKhOXMhIZGYkaNWqgTp06UodCRAXQ6wViE9MfJSi3cpbGT8rIu1CZtZUM3rZ6tAgPQP1A15wdkH1VlX5zQcrBxEViQ1uE4Kf9V3Hgyj1E30pChJ+z1CFVKjqdDhs2bMDQoUO5hDaRhdDrBa7eSzMakxJ9KxkpmXlXjLWRW6G2j5Nh4Gw9f2dUc7fD39u2oHv3CE4/r4KYuEjM38UO3er6YOPp2/hp31XMe6mh1CFVKocOHUJ8fDy7iYgkotMLXL2bmjP9+EYyztxKwtlbyUjNyidJsbZC+MMkJbe7p5a3E2ysjXdAtoSl/kk6TFwswButq2Hj6dtYf+oWxnasiWB3B6lDqjQiIyPh7e2NZs2aSR0KUaWXrdPjSkKa0XiUs7eTka7R5SmrtLZCHT/VY2ukOKOmtyMUcqt87kz0CBMXC9Ag0AVtanliz8UEfLPzMr54oYHUIVUKQgio1Wr06dMHVlb8ZUhkTlqdHpfjU/MkKZnavPuv2SnkOUviP2xFqefvjOqeDrBmkkImYOJiIcZ2rIk9FxOw7sRNjGlfE0HuFWfTSEsVHR2NK1euYMGCBVKHQlShabL1uHgnxTBoNupmMs7fTkZWdt4kxcFGjoiHLSiGMSmejpBzuQcyEyYuFuKpIFe0rumBfZfuYv7fFzHvxYZSh1ThRUZGwsnJCe3bt5c6FKIKIytbhwtxKTjzcFn8MzeTcCEuBRpd3iTFSWmNCH+VYY2Uuv7OCHV34JpUVKaYuFiQdzrXxr5LdxF54iZeb1UNdfxM3/GaclbL7d69e74bcxIRkKnV4XxcimHPnqibSbh4JwVanchTVmVrbTRotq6/M4Ld7JmkULlj4mJBGga6oGd9X2w8fRuz/zqHX157RuqQKqxr167h+PHjeP/996UOhcgiZGh0OHs7OWfPnof791yKT4VOnzdJcbFXPEpQHu6CHOhmxyUFyCIwcbEw73cJw9boOOy7dBe7LsSjXW0vqUOqkNavXw+FQoFu3bpJHQpRuUvXZOPsrdyunmScuZmEywn5JyluDjYPW1JyxqNE+DkjwJVJClkuJi4WJsjdHsNahOCHfVcxef0ZbBvXBnY2XA2ypNRqNTp06ACVit1tVLmlZmUj+uGmgrmLuV1JSIXIm6PAw1H5KEF52O3j62zLJIUqFCYuFmhcx1rYdPo2ridmYMHOS3i/a5jUIVUo9+7dw969e7Fw4UKpQyEyq+RMLaJvJj+2A3ISrt5NyzdJ8VYpDS0o9fxzBs96OSmZpFCFx8TFAjkorTG1dwT+98sxfL/3P/Rp6I/aPk5Sh1VhbNy4EXq9Hr1795Y6FCKTJaVrH+7X82iDwZh76fmW9XW2NQyczWlNUcHLybacIyYqH0xcLFTnCB90ruONbWfv4KPIKPz+ZnOug1BMarUazZo1g4+Pj9ShEBVLYprmsT17csalxCbmn6T4u9g9HDj7aEE3D0fOnKOqg4mLBZvaOwL/XL6LY9fuY/HeKxjZtobUIVm89PR0bN26FdOmTZM6FKJ8xadkGnX3RN9Kxs0HGfmWDXSzM8zuye32cXOwKeeIiSwLExcL5udihym9I/D+H6cxb9tFtKjugYaBLlKHZdG2bduGjIwMbqpIkhNC4E5yltGS+GduJeFOcla+5UM9HB5OP340u8fZnjsfEz2JiYuFe+HpAOy5mIBNp29j7OoT2PR2azgq+WUrSGRkJCIiIlCzZk2pQ6EqRAiBxCxga/QdnL+TZhibcjdVk6esTAZU93R8mJzkJCl1/FRwsmWSQlQc/Ato4WQyGWY9Vw8nYx/g2r10fBwZhfkvNeTMgHxkZ2fjzz//xMiRI6UOhSoxIQRiE9MNS+JHP0xS7qdbA8dPGZWVW8lQ08vR0JJS198Z4b4qOPA/H0Qm409PBeBsp8D8lxvi5e8PYf3JWwj3VWFEm+pSh2Vx9u3bh/v377ObiMxGrxe4ei/tUVfPzWScuZWElMzsPGXlMoHaPirU83dB3YCcRCXcVwVbBddhIjInJi4VRJMQN0ztVQefrI/GZ1vOo4anIzrW8ZY6LIsSGRmJgIAAPP3001KHQhWQTi9wJSH1UYLysDUlTaPLU9bG2grhPk6GRdzCvBzw34n96N2zORQKdvkQlSUmLhXI4OYhOB+Xgl//jcXY1Sfwx1stEO7LlWGBnOZ7tVqNvn37shuNiqTV6XE5PtVoc8Fzt1OQoc2bpNgqrFDH99HU47p+zqjp7QiF3OrR/bRaxJ7KcykRlQEmLhXM1N4RuJKQikP/JWLwT4exZkRzhHo4SB2W5E6cOIHr16/jueeekzoUsjC5OyBH38qZehx9KxnnbidDk63PU9bBRo4Iv5wF3Or65aw2W83DAdaPJSlEJC0mLhWMQm6FxYMa4+UfDuHc7WQM/OEQ1rzVAv4udlKHJqnIyEi4urqidevWUodCEkpK1z6WoOT8eyUhFfnsLQgnpTUiHu7bk9uaEuruACsu9Ehk0Zi4VEDO9gosf7UpXlp8EP/dTcPAHw5h5RvN4FeFkxe1Wo2ePXtyfEEVIYRAXHLOQm6PJykFLeTm4WiDOn45048j/HJaU4Lc7JmkEFVATFwqKE8nJVa8/gxe+O4gYu6lo/+iA/jl9WdQ3dNR6tDK3eXLl3HmzBlMnz5d6lCoDOj0AlfvpiH6VhLO3krG2ds5yUpiWt41UoCc1WYjfB8mKf4qRPhxc0GiyoSJSwXm52KH30c0x+Af/8V/d9Pw4ncHsXR4U9QLcJY6tHKlVqtha2uLzp07Sx0KlVJWtg4X41KNunvOx6UgPZ+ZPblrpNTxy0lOIh5OP3a2Y6sbUWXGxKWC83exw5oRzTF0yWGcuZmMFxcfxLwXG6BbPV+pQys3arUanTt3hoMDBylXJA/SNTh3OwXnbj/q7rkcn4rsfAak2CnkCPN1etjVk5Ok1PJ24hopRFUQE5dKwN1RiVVvNMPIX49j36W7eOvX43i7fQ2M61ir0vfh37lzBwcOHMDPP/8sdShUgNyunvNxObN5cpOV20mZ+ZZ3sVcYJSgRfiqEejhyd3QiAsDEpdJwslVgybAmmP3Xefy0/yq+3nkZJ28kYe4L9eHlZCt1eGVmw4YNkMlk6Nmzp9ShEICkDC3O385JUM7H5SQoF+6kIFObd+oxAAS42iHcV2WUqPg623I8ChEViIlLJWItt8InPesg3FeFjyOjsPdiArrN34fP+9dHh/DKucquWq3Gs88+Cw8PD6lDqVL0eoGYe2mG5CS3JaWgWT22CivU9lGhjq8Twn1zxqLU9nGCihsLElEJMXGphPo/HYD6Ac54e9UJnI9LwWvLjqLfU/6Y1KMO3BxspA7PbJKTk7Fjxw58/vnnUodSqd1P0+DinRRcuJNi6Oa5EJf/KrNAzrirMJ9HCUq4rxOC3R3Y1UNEZsHEpZKq5e0E9aiW+GLrBfz8z1WsO34Tu87H46Pu4Xj+qYBKMfZly5Yt0Gg06NOnj9ShVAppWdm4FJ+Ki3E5ScrFOym4EJeC+JSsfMsrra1Q28cJ4T4qhOW2pPio4GzPVhQiKjtMXCoxW4Ucn/Ssgx71ffHRuiicj0vBe3+cxs//xODDbmF4tpan1CGW2IIFC7Bz505ERkYiMjISjRo1QkhIiNRhVShZ2Tr8l5BmSExyW1OuJ+bfzQPktKLU8nZEuK8KYb45XT4h7lwKn4jKHxOXKuCpIFf8OaYVft5/Fd/suoxzt5Mx5OfDaFXDA+M71cLTwa5Sh1hsWVlZ2L59OzIyMrBp0ya8++67yMrKwokTJ9CsWTOpw7Mommw94tKBrdF3cOVuhiFBuXo3Dbr81sBHzsKGtbwdUcvbCbW9nVDLxwk1vRzhxLEoRGQhmLhUEQq5Fd5sUx0vNg7EN7su45eD17D/8l3sv3wXTUJc8eaz1dE+zMviu5DCw8ORlpaGP/74AykpKejZsyf69++PXbt24f79+1Vyyf+UTC2uJKThSnwqLiek4nJ8Kq4kpCL2Xjqy9dbAqbzbFjvZWiPMxyknQXn4by1vp0o1BoqIKicmLlWMq4MNPulZB8NahGDBzkuIPHETR2Lu40jMUVTzdMArTYPwXCN/uDsqpQ41X+Hh4QCA1atXIzQ0FLNmzcK2bduwYcOGSp20CCGQkJJlSEouP0xSrsSnIS45//VQAEBpJVDL1xm1fVSGFpTa3k7wVnEJfCKqmJi4VFGBbvb4vH8DvNO5Npb8E4NfD13DfwlpmLHpHD7bch6d6nijX6MAtK7lAaW15axOGhwcDFtbW+zbtw/+/v5Yv3491q5diy5dukgdmlncT9Mg5l4aYu6l4erddFy7l4aYu2n4724aUjKzC7zO00mJGp6OqO7lgBqejqjh5YQgVyWO79+JHj2aVeqkjoiqFiYuVZy3yhYTu4VhVLvqWH/yFn4/eh2nbyRhc1QcNkfFwVFpjfZhXuhW1wcta3pIvu6GXKNBQ19fnLx6FRcvXsTq1avRu3dvSWMqCSEEHqRrEXMvDdfupePq3bSHiUo6Yu6mISlDW+C1VjIgyM0eNbwcUd3TEdW9HA2f57c/j1arBRtViKiyYeJCAHJW3h3ULBiDmgXj7K1krDl2HX9FxSEuORMbTt3ChlO3ILeSoUGAM1rV8EDLGh5oFOQKG+tymlWyfz8wbx6wfj0O6vXQAbjRqBGC/fzK5/klkJSuxfX76bhxPwM3DP8++jw1q+CWEwDwUdkixMMeIe4OCPFwQIi7A0I9HBDsbs+9eYioymPiQnnU8VNhil8EPulRBydvPMBfUbex41w8rt5Nw/HYBzge+wBf77wMG7kVwv1UaBjgjPoBLmgQ6Fw2U2QXLQJGjQLkckCfs3S8HEDwqVNA69bAwoXAiBHmfWYB0jXZiEvKRFxyJu4kZyIuKQt3kjNx88Gj5KSwLp1c3iplTmLyMDkJ9bBHiIcDgtzsYW/DH0siooLwNyQVyMpKhqeCXPFUkCs+7lEHN+6n48Dle9h/+S7+uXwX99I0OHX9AU5dfwDgGgDARm6FEI+c7owaXk4I9bCHn7Md/Fzs4K2yRYl7Lvbvz0lahACyn0gIcl+PHAnUqwe0bGnS+8zU6pCYpkFimgb30jRITMvCvdSc1/EpWQ8TlJxkpThJCQB4ONrA39UeAa52Dz9yPg90tYe/ix3sbNhyQkRkCiYuVGwBrvZ4sYk9XmwSCCEEYhPTcfL6A5y+kYRT1x/gzK0kZGr1uHgnFRfvpAKIM7peJgM8HZWwE3Ksu3cc7g5KuNjbwNVeARcHGzgq5bBTyKFUyGFrLYetwgrVZ30OJys5ZLqCEwZhJceDGZ/h3Dc/IytbD83Dj7SsbKRkZiMlKxspmVqkZGYjNTMbKVk5n99P1yAxVYM0Tf5L1xfEwUYOb2dbeDvZwsfZFt4qW/i72CLA1R6BbjlJGltNiIjKBn+7kklkMhmC3R0Q7O6APg39AeRsvHfzQcbDabo5U3ZjE9Nx60EGbiVlQpOtf7h8vAzXLt4t8hlKbRbObtkImch/sTRDLLpsqLZuxPCFe5GlMG0at7WVDK4ONnB3sIG7ow3cHJRwd7CBp5MS3ipb+Khs4eOc8zkXYyMikg4TFzIbKysZAt3sEehmj3a1vYzOCSFwL02D2Lsp2LTrAKqH10NKlh7307V4kK7B/XQN0jU6ZGh0yMzWIVOrh11iBuRFJC255EKgvkqGdFcVlNZWsLG2goONNZxsreFoaw0nWwUcldZQPXztqFTA1V4BNwcbuDsoobKz5romREQVABMXKhcymQwejko4K61w3U2g+9MBRa8tkpEBzLYyDMgtlJUV1rzfFbCzM0/ARERkkbhDGlkuOzugTx/Auoj82toaeO45Ji1ERFUAExeybBMmALoiBs/qdMD48eUTDxERSYqJC1m2Vq1y1mmRyfK2vFhb5xxfuNDkqdBERFSxMHEhyzdiBLBvX063kdXDb1krq5zX+/aV2+JzREQkPQ7OpYqhZcucj4wMIDkZUKk4poWIqApi4kIVi50dExYioiqMXUVERERUYTBxISIiogqDiQsRERFVGExciIiIqMKQNHFZtGgR6tevD5VKBZVKhebNm+Ovv/6SMiQiIiKyYJImLgEBAZgzZw6OHj2Ko0ePon379ujTpw+io6OlDIuIiIgslKTToXv16mX0eubMmVi0aBEOHTqEiIgIiaIiIiIiS2Ux67jodDqsWbMGaWlpaN68udThEBERkQWSPHGJiopC8+bNkZmZCUdHR0RGRqJOnTr5ls3KykJWVpbhdVJSEgAgMTERWq3W5Bi0Wi3S09Nx7949KBQKk+9DRWNdlx/WdflhXZcv1nf5Kau6TklJAQAIIUp8rUyYcpUZaTQaxMbG4sGDB1i7di1+/PFH7NmzJ9/kZerUqZg2bZoEURIREZG5Xb9+HQEBASW6RvLE5UkdO3ZE9erVsXjx4jznnmxx0ev1SExMhLu7O2QymcnPTE5ORmBgIK5fvw6VSmXyfahorOvyw7ouP6zr8sX6Lj9lVddCCKSkpMDPzw9WViWbJyR5V9GThBBGycnjlEollEql0TEXFxezPTt3WjaVPdZ1+WFdlx/WdflifZefsqhrZ2dnk66TNHH56KOP0K1bNwQGBiIlJQWrV6/G7t27sWXLFinDIiIiIgslaeJy584dDB48GLdv34azszPq16+PLVu2oFOnTlKGRURERBZK0sTlp59+kvLxBkqlElOmTMnTDUXmx7ouP6zr8sO6Ll+s7/JjiXVtcYNziYiIiArCTRaJiIiowmDiQkRERBUGExciIiKqMJi4EBERUYXBxAXAwoULERoaCltbWzz99NPYt2+f1CFZjNmzZ6NJkyZwcnKCl5cX+vbtiwsXLhiVEUJg6tSp8PPzg52dHdq2bYvo6GijMllZWRgzZgw8PDzg4OCA3r1748aNG0Zl7t+/j8GDB8PZ2RnOzs4YPHgwHjx4YFQmNjYWvXr1goODAzw8PPD2229Do9GUyXuX2uzZsyGTyTBu3DjDMda1+dy8eRODBg2Cu7s77O3t0bBhQxw7dsxwnnVtHtnZ2Zg0aRJCQ0NhZ2eHatWqYfr06dDr9YYyrGvT7d27F7169YKfnx9kMhnUarXReUur26ioKLRp0wZ2dnbw9/fH9OnTS75fkajiVq9eLRQKhfjhhx/E2bNnxdixY4WDg4O4du2a1KFZhC5duoglS5aIM2fOiJMnT4oePXqIoKAgkZqaaigzZ84c4eTkJNauXSuioqLESy+9JHx9fUVycrKhzIgRI4S/v7/Yvn27OH78uGjXrp1o0KCByM7ONpTp2rWrqFu3rjhw4IA4cOCAqFu3rujZs6fhfHZ2tqhbt65o166dOH78uNi+fbvw8/MTo0ePLp/KKEeHDx8WISEhon79+mLs2LGG46xr80hMTBTBwcFi2LBh4t9//xVXr14VO3bsEJcvXzaUYV2bx4wZM4S7u7vYuHGjuHr1qlizZo1wdHQU8+fPN5RhXZtu8+bN4uOPPxZr164VAERkZKTReUuq26SkJOHt7S1efvllERUVJdauXSucnJzE3LlzS/Seq3zi0rRpUzFixAijY2FhYWLixIkSRWTZ4uPjBQCxZ88eIYQQer1e+Pj4iDlz5hjKZGZmCmdnZ/Hdd98JIYR48OCBUCgUYvXq1YYyN2/eFFZWVmLLli1CCCHOnj0rAIhDhw4Zyhw8eFAAEOfPnxdC5PyAWllZiZs3bxrKrFq1SiiVSpGUlFR2b7qcpaSkiJo1a4rt27eLNm3aGBIX1rX5fPDBB6JVq1YFnmddm0+PHj3Eq6++anSsX79+YtCgQUII1rU5PZm4WFrdLly4UDg7O4vMzExDmdmzZws/Pz+h1+uL/T6rdFeRRqPBsWPH0LlzZ6PjnTt3xoEDBySKyrIlJSUBANzc3AAAV69eRVxcnFEdKpVKtGnTxlCHx44dg1arNSrj5+eHunXrGsocPHgQzs7OeOaZZwxlmjVrBmdnZ6MydevWhZ+fn6FMly5dkJWVZdTEX9GNGjUKPXr0QMeOHY2Os67NZ8OGDWjcuDFeeOEFeHl5oVGjRvjhhx8M51nX5tOqVSv8/fffuHjxIgDg1KlT2L9/P7p37w6AdV2WLK1uDx48iDZt2hgtZtelSxfcunULMTExxX5fFrfJYnm6e/cudDodvL29jY57e3sjLi5OoqgslxACEyZMQKtWrVC3bl0AMNRTfnV47do1QxkbGxu4urrmKZN7fVxcHLy8vPI808vLy6jMk89xdXWFjY1Npfl6rV69GsePH8eRI0fynGNdm89///2HRYsWYcKECfjoo49w+PBhvP3221AqlRgyZAjr2ow++OADJCUlISwsDHK5HDqdDjNnzsSAAQMA8Pu6LFla3cbFxSEkJCTPc3LPhYaGFut9VenEJZdMJjN6LYTIc4yA0aNH4/Tp09i/f3+ec6bU4ZNl8itvSpmK6vr16xg7diy2bdsGW1vbAsuxrktPr9ejcePGmDVrFgCgUaNGiI6OxqJFizBkyBBDOdZ16f32229YsWIFVq5ciYiICJw8eRLjxo2Dn58fhg4daijHui47llS3+cVS0LUFqdJdRR4eHpDL5Xky7fj4+DyZY1U3ZswYbNiwAbt27UJAQIDhuI+PDwAUWoc+Pj7QaDS4f/9+oWXu3LmT57kJCQlGZZ58zv3796HVaivF1+vYsWOIj4/H008/DWtra1hbW2PPnj34+uuvYW1tbfQ/k8exrkvO19cXderUMToWHh6O2NhYAPy+Nqf33nsPEydOxMsvv4x69eph8ODBGD9+PGbPng2AdV2WLK1u8ysTHx8PIG+rUGGqdOJiY2ODp59+Gtu3bzc6vn37drRo0UKiqCyLEAKjR4/GunXrsHPnzjxNeaGhofDx8TGqQ41Ggz179hjq8Omnn4ZCoTAqc/v2bZw5c8ZQpnnz5khKSsLhw4cNZf79918kJSUZlTlz5gxu375tKLNt2zYolUo8/fTT5n/z5axDhw6IiorCyZMnDR+NGzfGwIEDcfLkSVSrVo11bSYtW7bMM63/4sWLCA4OBsDva3NKT0+HlZXxnxq5XG6YDs26LjuWVrfNmzfH3r17jaZIb9u2DX5+fnm6kApV7GG8lVTudOiffvpJnD17VowbN044ODiImJgYqUOzCG+99ZZwdnYWu3fvFrdv3zZ8pKenG8rMmTNHODs7i3Xr1omoqCgxYMCAfKfbBQQEiB07dojjx4+L9u3b5zvdrn79+uLgwYPi4MGDol69evlOt+vQoYM4fvy42LFjhwgICKjQUxmL8visIiFY1+Zy+PBhYW1tLWbOnCkuXbokfv31V2Fvby9WrFhhKMO6No+hQ4cKf39/w3TodevWCQ8PD/H+++8byrCuTZeSkiJOnDghTpw4IQCIefPmiRMnThiW9LCkun3w4IHw9vYWAwYMEFFRUWLdunVCpVJxOrQpvv32WxEcHCxsbGzEU089ZZjqSznT6/L7WLJkiaGMXq8XU6ZMET4+PkKpVIpnn31WREVFGd0nIyNDjB49Wri5uQk7OzvRs2dPERsba1Tm3r17YuDAgcLJyUk4OTmJgQMHivv37xuVuXbtmujRo4ews7MTbm5uYvTo0UZT6yqbJxMX1rX5/Pnnn6Ju3bpCqVSKsLAw8f333xudZ12bR3Jyshg7dqwICgoStra2olq1auLjjz8WWVlZhjKsa9Pt2rUr39/RQ4cOFUJYXt2ePn1atG7dWiiVSuHj4yOmTp1aoqnQQgghE6KkS9YRERERSaNKj3EhIiKiioWJCxEREVUYTFyIiIiowmDiQkRERBUGExciIiKqMJi4EBERUYXBxIWIiIgqDCYuRFTmZDIZ1Gq11GEQUSXAxIWISi0uLg5jxoxBtWrVoFQqERgYiF69euHvv/82+7N2794NmUyGBw8emP3eRGT5rKUOgIgqtpiYGLRs2RIuLi74/PPPUb9+fWi1WmzduhWjRo3C+fPnpQ4xX0II6HQ6WFvz1yBRRcIWFyIqlZEjR0Imk+Hw4cPo378/atWqhYiICEyYMAGHDh3KUz6/FpOTJ09CJpMhJiYGAHDt2jX06tULrq6ucHBwQEREBDZv3oyYmBi0a9cOAODq6gqZTIZhw4YByElEPv/8c1SrVg12dnZo0KAB/vjjjzzP3bp1Kxo3bgylUol9+/aVWb0QUdngfzWIyGSJiYnYsmULZs6cCQcHhzznXVxcTLrvqFGjoNFosHfvXjg4OODs2bNwdHREYGAg1q5di+effx4XLlyASqWCnZ0dAGDSpElYt24dFi1ahJo1a2Lv3r0YNGgQPD090aZNG8O933//fcydOxfVqlUzOT4ikg4TFyIy2eXLlyGEQFhYmFnvGxsbi+effx716tUDAFSrVs1wzs3NDQDg5eVlSDzS0tIwb9487Ny5E82bNzdcs3//fixevNgocZk+fTo6depk1niJqPwwcSEik+VuLi+Tycx637fffhtvvfUWtm3bho4dO+L5559H/fr1Cyx/9uxZZGZm5klINBoNGjVqZHSscePGZo2ViMoXx7gQkclq1qwJmUyGc+fOFfsaK6ucXzu5SQ8AaLVaozKvv/46/vvvPwwePBhRUVFo3LgxFixYUOA99Xo9AGDTpk04efKk4ePs2bNG41wA5NulRUQVBxMXIjKZm5sbunTpgm+//RZpaWl5zuc3ZdnT0xMAcPv2bcOxkydP5ikXGBiIESNGYN26dXjnnXfwww8/AABsbGwAADqdzlC2Tp06UCqViI2NRY0aNYw+AgMDS/MWicjCMHEholJZuHAhdDodmjZtirVr1+LSpUs4d+4cvv76a8N4k8flJhNTp07FxYsXsWnTJnz55ZdGZcaNG4etW7fi6tWrOH78OHbu3Inw8HAAQHBwMGQyGTZu3IiEhASkpqbCyckJ7777LsaPH49ly5bhypUrOHHiBL799lssW7asXOqBiMoHExciKpXQ0FAcP34c7dq1wzvvvIO6deuiU6dO+Pvvv7Fo0aI85RUKBVatWoXz58+jQYMG+OyzzzBjxgyjMjqdDqNGjUJ4eDi6du2K2rVrY+HChQAAf39/TJs2DRMnToS3tzdGjx4NAPj0008xefJkzJ49G+Hh4ejSpQv+/PNPhIaGln0lEFG5kYnHO5qJiIiILBhbXIiIiKjCYOJCREREFQYTFyIiIqowmLgQERFRhcHEhYiIiCoMJi5ERERUYTBxISIiogqDiQsRERFVGExciIiIqMJg4kJEREQVBhMXIiIiqjCYuBAREVGF8f+Y5X5ytyhMdAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "predictor = Predictor()\n",
    "min_x = predictor.draw((1000, 100000), 500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aae24dae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "min_x: 23396.396396396394\n",
      "vector_per_cluster: 85.48324990373509\n",
      "cluster_size: 10941.855987678091\n",
      "L3_visit: 5847.5024889195465\n",
      "nprobe: 68.40524307983812\n",
      "L1_latency: 0.5130393230987859\n",
      "L2_latency: 1.1094475362011245\n",
      "L3_latency: 1.622287400379402 L3_Cal: 1.4618756222298865 L3_IO: 1.622287400379402\n",
      "Latency: 3.2447742596793123\n"
     ]
    }
   ],
   "source": [
    "print(\"min_x:\",min_x)\n",
    "print(\"vector_per_cluster:\",predictor.vector_per_cluster(min_x))\n",
    "print(\"cluster_size:\",predictor.cluster_size(min_x))\n",
    "print(\"L3_visit:\",predictor.L3_visit(min_x))\n",
    "print(\"nprobe:\",predictor.nprobe(min_x))\n",
    "print(\"L1_latency:\",predictor.L1_latency(min_x))\n",
    "print(\"L2_latency:\",predictor.L2_latency(min_x))\n",
    "print(\"L3_latency:\",predictor.L3_latency(min_x), \"L3_Cal:\",predictor.L3_Cal(min_x), \"L3_IO:\",predictor.L3_IO(min_x))\n",
    "print(\"Latency:\",predictor.Latency(min_x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7893b43e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py312",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
